Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comparaison de 2 tables mysql

Sujet résolu
    23 mai 2018 à 10:54:39

    Bonjour lors 2 mon stage un projet m'a été confié ayant pour but de comparer les commandes venant de prestashop et de cbr (progiciel), pour cela le n° de commande (ex: br34am) et son prix (ex: 34.90) sont stockés dans une table mysql, donc je me retrouve avec une table pour cbr et une pour prestashop contenant toutes les commandes et leur prix.
    Tout d'abord je dois vérifier l'existence des commandes dans l'autre table (il arrive parfois que certaines commandes n'arrivent pas aux logiciel cbr).
    Et ensuite je dois m'assurer que le prix soit le même dans la table cbr et la table prestashop pour chaque commande.
    Merci pour votre aide, je suis débutant en PHP et je ne sais pas comment récupérer la différence de 2 tables.
    Voici un exemple des tables : 
    EDIT : j'ai réussi à afficher les commandes qui n'existaient pas dans l'autre table table avec NOT EXISTS

    -
    Edité par HugoLahaxe 23 mai 2018 à 11:13:21

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2018 à 11:18:31

      Bonjour,

      Je te propose une solution à base de SQL/PHP :

      SELECT tp.id_commande, tp.prix_commande, tc.prix_commande
      FROM table_prestashop tp
      LEFT JOIN table_cbr tc ON tp.id_commande = tc.id_commande

      (à adapter en fonction de tes noms de tables et colonnes : cette requête te renvoie toutes les commandes "prestashop", si elle ne trouve pas d'association "cbr" pour une commande, la colonne "tc.prix_commande" sera nulle)

      Donc, tu mets les résultat de cette requête (un tableau) dans une variable PHP et tu affiches ce tableau dans une boucle foreach.

      Dans cette boucle foreach, tu peux faire des comparaisons entre les colonnes tp.prix_commande et tc.prix_commande : si tc.prix_commande est nul tu peux écrire "commande non trouvée chez cbr ou son prix est nul"

      et sinon, si tp.prix_commande et tc.prix_commande sont différents, tu peux écrire "La commande cbr a été trouvée mais son prix est différent de la commande prestashop".

      Ces comparaisons et messages PHP peuvent être faits en SQL en ajoutant des conditions dans la requête si tu préfères (et du coup, si tu le fais en SQL, tu as juste à afficher le tableau en PHP).

      -
      Edité par daemonhell 23 mai 2018 à 11:18:55

      • Partager sur Facebook
      • Partager sur Twitter
        23 mai 2018 à 11:19:12

        Bonjour,

        Avec la fonction in_array() je pense que tu va pouvoir gérer une différence entre t'es deux tableaux, tu parcours le premier et à chaque itération tu regarde si la "ligne" existe dans l'autre tableau.

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2018 à 12:06:25

          D'en le cours openclassroom sur php, mysql ils ne nous indiquent pas trop comment utiliser forEach donc je n'arrive pas à utiliser foreach voici mon code :

          $req =
          'SELECT tp.nCommande, tp.prix, tc.prix
          FROM presta tp
          LEFT JOIN cbr tc ON tp.nCommande = tc.nCommande';
          
          foreach ($req as  $donnees) {
            if (tc.prix == NULL) {
              echo "La commande : " . $donnees['nCommande'] . 'n\'existe pas';
            }
            elseif (tc.prix != tp.prix) {
              echo "La commande " . $donnees['nCommande'] . 'n\'a pas le même prix';
            }
          }


          deamonhell

          -
          Edité par HugoLahaxe 23 mai 2018 à 12:48:34

          • Partager sur Facebook
          • Partager sur Twitter
            23 mai 2018 à 13:14:29

            Le code m'a l'air bon, mais tu ne peux pas juste passer une chaîne de caractères contenant une requête SQL dans une variable PHP (Sinon, le tableau parcouru, ce sera chacune des lettres de ta chaîne de caractères, ce qui n'est pas très intéressant dans notre cas :p )

            Il te faut la connexion à la base, je t'invite à lire ces quelques pages de doc PHP/MySQL : 

            https://secure.php.net/manual/fr/mysqli.construct.php

            http://php.net/manual/fr/pdo.construct.php 

            http://php.net/manual/fr/pdostatement.fetchall.php

            Tu auras besoin des caractéristiques de ta base de données : utilisateur, mot de passe, adresse host, port

            PS : Si tu veux voir si le contenu de ton tableau est bien celui attendu :

            <?php
            echo '<pre>';
            print_r($tableau);
            exit;



            -
            Edité par daemonhell 23 mai 2018 à 13:19:40

            • Partager sur Facebook
            • Partager sur Twitter
              23 mai 2018 à 14:33:36

              J'ai réussi à récupérer l'array mais dans mon array il ne s'appelle pas tc.prix et tp.prix mais 1 et 2, et si j'utilise 1 et 2 à la place le code trouve bien celle dont le prix est différent. N'y a-t-il pas un moyen de faire en sorte qu'il s'appelle tc.prix et tp.prix dans l'array ?  (et pour ce qui est de la connexion à la base de données je ne l'avais pas inclus car cela me semblait une évidence)

              -
              Edité par HugoLahaxe 23 mai 2018 à 14:55:28

              • Partager sur Facebook
              • Partager sur Twitter
                23 mai 2018 à 18:29:48

                Pardon alors d'avoir douté :)

                Oui, en SQL tu peux changer le nom de la colonne, ce qui changera le nom de l'indice du tableau PHP :

                SELECT tp.nCommande, tp.prix AS tp_prix, tc.prix AS tc_prix
                FROM presta tp
                LEFT JOIN cbr tc ON tp.nCommande = tc.nCommande

                (pas sûr qu'on puisse mettre des points dans le nom par contre)

                • Partager sur Facebook
                • Partager sur Twitter
                  24 mai 2018 à 9:30:29

                  Ok merci beaucoup j'ai pu réaliser ce que je souhaité.

                  Merci à toi et bonne continuation (Voici le code final)

                  // Connexion à la base de données
                  try {
                    $bdd = new PDO('mysql:host=localhost;dbname=compare_table;charset=utf8', 'root', '');
                  }
                  catch(Exception $e) {
                    die('Erreur : '.$e->getMessage());
                  }
                  // Affiche si une commande n'existe pas sur cbr
                  echo "<br><br><br>";
                  $result = $bdd->query('SELECT nCommande FROM presta WHERE NOT EXISTS (SELECT nCommande FROM cbr WHERE presta.nCommande = cbr.nCommande)');
                  while ($donnees = $result->fetch()) {
                    echo 'La commande ' . $donnees['nCommande'] . ' n\'existe pas sur cbr.' . ' <br />';
                  }
                  
                  // Affiche si une commande n'existe pas sur prestashop
                  echo "<br>";
                  $result = $bdd->query('SELECT nCommande FROM cbr WHERE NOT EXISTS (SELECT nCommande FROM presta WHERE presta.nCommande = cbr.nCommande)');
                  while ($donnees = $result->fetch()) {
                    echo 'La commande ' . $donnees['nCommande'] . ' n\'existe pas sur prestashop.' . ' <br />';
                  }
                  
                  // Affiche si une commande n'a pas le même prix sur cbr et prestashop
                  echo "<br>";
                  $req =$bdd->query(
                  'SELECT tp.nCommande, tp.prix, tc.prix FROM presta tp LEFT JOIN cbr tc ON tp.nCommande = tc.nCommande');
                  $result = $req->fetchAll();
                  // echo '<pre>';
                  // print_r($result);
                  
                  foreach($result as $donnees) {
                    if ($donnees['1'] != $donnees['2'] AND $donnees['prix'] != NULL) {
                      echo "La commande " . $donnees['nCommande'] . ' n\'a pas le même prix sur prestashop (' . $donnees['1'] . ') et cbr (' . $donnees['2'] . ').<br>';
                    }
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Comparaison de 2 tables mysql

                  × 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