Partage
  • Partager sur Facebook
  • Partager sur Twitter

comparer les variables de 2 tables

Sujet résolu
    7 juillet 2006 à 10:35:32

    Bonjour,
    J'ai 2 tables et je souhaite vérifier si les valeurs sont identiques.
    table1
    | id | champ1 | champ2 | champ3 |
    |1 | pomme |fraise | poire |


    table2
    | id | champ1 | champ2 | champ3 |
    |1 | noix |cerise | pomme |
    |2 | poire |ananas | fraise |
    |3 | peche |tomate | pomme |
    |4 | fraise |poire | pomme |

    Selon les valeurs, je souhaite que ça me renvoie le nombre de fruit identique mais par ligne .
    table2
    ligne1 = 1 (car pomme dans les 2 tables)
    ligne2 = 2 (car poire et fraise dans les 2 tables)
    ligne3 = 1 (car pomme dans les 2 tables)
    ligne4 = 3 (car pomme, fraise et poire dans les 2 tables)
    J'espère être le plus explicite possible.
    merci
    • Partager sur Facebook
    • Partager sur Twitter
      7 juillet 2006 à 11:32:42

      $requete = mysql_query("SELECT * FROM table1 WHERE id=1 ");
      $donneesA = mysql_fetch_array($requete);

      $requete = mysql_query("SELECT * FROM table2 WHERE id=1 ");
      $donneesB = mysql_fetch_array($requete);

      echo count(array_intersect($donneesA, $donneesB));


      Essaye de comprendre, et n'oublie pas la doc ^^
      Fait une boucle si tu veut explorer chaque ligne ;) !
      • Partager sur Facebook
      • Partager sur Twitter
        7 juillet 2006 à 11:44:53

        wouaou j'essaye de comprendre mais ce n'est pas simple...
        où faire la boucle ?
        merci
        • Partager sur Facebook
        • Partager sur Twitter
          7 juillet 2006 à 11:49:42

          Mon code d'au dessu ne marche pas, par contre celui-là, si !
          Si je reprend les tables que tu as donné dans ton message, tu peut faire comme ca :

          $requete = mysql_query("SELECT champ1, champ2, champ3 FROM table1");
          $donneesA = mysql_fetch_array($requete, MYSQL_NUM);

          $requete = mysql_query("SELECT champ1, champ2, champ3 FROM table2");
          while ($donneesB = mysql_fetch_array($requete, MYSQL_NUM))
          {
             echo count((array_intersect($donneesB, $donneesA))) .'<br />';
          }


          J'ai testé, ca marche ^^

          Je t'explique :
          - Comme il y a un seul champ dans la table 1, pas besoin de faire une boucle ici. On donne aussi un autre paramètres à mysql_fetch_array , "MYSQL_NUM", de manière à ce que MySQL ne renvoie que les champs sous forme de tableau numérique ( comme ca, pas de doublons, puisque MySQL renvoie habituellement les tableaux sous forme numérique ET associatifs ! )
          - Comme il y a plusieurs champs dans la table 2, on fait une boucle cette fois.
          - Pour ces deux séléctions, tu remarqueras qu'a la place de l'étoile (*), j'ai mis le noms des champs. En effet, de cette manière, je ne séléctionne pas l'id, qui sera autrement compté dans les similitudes entre les deux tables ^^
          - La fonction "array_intersect" renvoie un array qui contient les champs possèdant comme valeurs les valeurs de tableau similaires entre ceux entrés en paramètres ( tu me suis toujours ? ^^ )
          - Enfin, "count" permet de compter le nombre de valeurs ;) !



          Mon code à moi me renvoit ca :

          1
          2
          1
          3


          Magique, c'est pareil que toi :magicien:^^
          • Partager sur Facebook
          • Partager sur Twitter
            7 juillet 2006 à 13:38:52

            Génial ! ça fonctionne impécable.
            Et pour avoir l'id de chaque ligne avant le résultat ?
            o_O
            • Partager sur Facebook
            • Partager sur Twitter
              7 juillet 2006 à 14:13:57

              Très simple, mais ca rajoute une requete :

              $requete = mysql_query("SELECT champ1, champ2, champ3 FROM table1");
              $donneesA = mysql_fetch_array($requete, MYSQL_NUM);

              $requete = mysql_query("SELECT champ1, champ2, champ3 FROM table2");
              while ($donneesB = mysql_fetch_array($requete, MYSQL_NUM))
              {
                 $requete_pour_ligne = mysql_query("SELECT id FROM table2 WHERE champ1='". $donneesB[0] ."' AND champ2='". $donneesB[1] ."' AND champ3='". $donneesB[2] ."' LIMIT 0,1");
                 $donnees_pour_ligne = mysql_fetch_array($requete_pour_ligne);
                 $ligne = $donnees_pour_ligne['id'];

                 echo 'Ligne '. $ligne .' = '. count((array_intersect($donneesB, $donneesA))) .'<br />';
              }


              On est obligé de refaire une requete puisque dans la requete de la boucle, on n'a pas séléctionner l'id : on séléctionne l'entrée où champ1 vaut le champ1 de la boucle, champ2 vaut le champ2 de la boucle ...etc.. comme ca on a la même entrée que celle de la boucle, et au cas où il y aurait plusieurs fois la même entrée, on fait un LIMIT 0,1 pour ne séléctionner qu'une seul entrée ;) ( le numéro de ligne peut donc être faussé si il y a deux entrée exactement semblable dans la table2 ) !

              Par contre, si tu est sur qu'il n'y a pas de nombre, a part l'ID, dans la table 1, tu peut faire plus simple encore :

              $requete = mysql_query("SELECT champ1, champ2, champ3 FROM table1");
              $donneesA = mysql_fetch_array($requete, MYSQL_NUM);

              $requete = mysql_query("SELECT id, champ1, champ2, champ3 FROM table2");
              while ($donneesB = mysql_fetch_array($requete, MYSQL_NUM))
              {
                 $ligne = $donneesB[0];

                 echo 'Ligne '. $ligne .' = '. count((array_intersect($donneesB, $donneesA))) .'<br />';
              }


              Comme il n'y a pas de nombre dans la table 1, tu est sur que l'id de la table2 ne sera pas similaire à un champ de la table1 et donc tu peut le séléctionner dans la boucle :D. En l'occurence, avec les fruits, ca marche ;) !
              • Partager sur Facebook
              • Partager sur Twitter
                7 juillet 2006 à 17:03:08

                hum...
                ça ne fonctionne pas :(
                Il doit y avoir un soucis...
                L'id ne s'affiche pas...
                • Partager sur Facebook
                • Partager sur Twitter
                  7 juillet 2006 à 17:17:39

                  :euh:

                  Si tu utilisais le deuxième script, c'est normal ;) Mais j'ai éditer, et ca devrais marcher maintenant ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 juillet 2006 à 17:20:19

                    Non j'utilise le premier script car il y a d'autres nombre dans ma table.
                    Et il ne fonctionne pas.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 juillet 2006 à 17:25:42

                      Ca marche bien chez moi pourtant...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 juillet 2006 à 17:28:18

                        :colere2:
                        le problème viens de chez moi certainement alors.

                        Les id de la table2 existent déjà chez moi et peuvent être n'importe lesquelles...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 juillet 2006 à 17:32:12

                          Tu utilise exactement le même code que moi ? Si c'est non, montre moi ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 juillet 2006 à 17:36:26

                            génial, c'est moi qui avait fait une erreur de recopiage...
                            tu m'avais mis le doute

                            ça marche :lol:

                            merci beaucoup Blackhole !
                            • Partager sur Facebook
                            • Partager sur Twitter

                            comparer les variables de 2 tables

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown