Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete SQL multitable ?

    22 juin 2017 à 17:47:49

    Bonjour à tous,

    Je bosse depuis peu en php et SQL (postgresql).

    J'ai fait une routine a base de boucles qui fonctionne mais est super lente dès qu'il y a de nombreuses requetes.

    Je suis sur une base Psql qui contient des commandes avec des produits dans plusieurs tables.

    Je veux lister tous les produits contenu dans certaines commandes.

    Pour l'instant j'ai fait comme ca :

    <?php 
    // Connexion BDD
    try {
        $conn = new PDO("pgsql:host=$servername;dbname=$dbname", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } 
    
    // message erreur sur requete PDO
    catch(PDOException $e)
        {
        echo $conn . "<br>" . $e->getMessage();
        }
    
    // recherche des commandes  
    $requete =  $conn->query("SELECT id FROM table_order WHERE date_order>='$date_debut' AND date_order<='$date_fin'");   
    
    //premiere boucle    
    while($row = $requete->fetchObject()) {
    ${'commande'.$i} = $row->id;
    
    //--------------lecture des produits de la commande--------------//
    $requeteline = $conn->query("SELECT product_id,qty FROM table_order_line WHERE order_id='${'commande'.$i}'");
    
    //deuxieme boucle    
    while ($line = $requeteline->fetchObject()) { 
    $qty = $line->qty;
    $prod_id = $line->product_id;
    
    $requete_name = $conn->query("
        SELECT name_template
        FROM table_product 
        WHERE id=$prod_id");
      
    $nomproduit = $requete_name->fetchColumn();
    
    $requete_variante = $conn->query("
        SELECT att_id  
        FROM table_attribute_value_product_product_rel  
        WHERE prod_id=$prod_id");
    
    $varianteid = $requete_variante->fetchColumn(); 
    
      }
       ++$i; // commande suivante
    }
    ?>

    Le souci est que dès qu'il y a beaucoup de commande, çà génère énormément de requêtes et prend du temps à me sortir le résultat.

    Je pense qu'il y a peut-être moyen de recherche tout rapidement mais je n'arrive pas à trouver...

    Merci pour votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      22 juin 2017 à 19:05:06

      Bonjour,

      Je te conseille de (re)lire le cours sur les jointures SQL ...

      https://openclassrooms.com/courses/administrez-vos-bases-de-donnees-avec-mysql/jointures-1

      Pas étonnant que ton code soit lent :p

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        22 juin 2017 à 22:59:58

        Merci Benzouye.

        J'ai regardé mais j'arrive pas a trouver comment l'utiliser :(

        Il faudrait que je lance mes requetes avec JOIN avant les boucles ?

        • Partager sur Facebook
        • Partager sur Twitter
          22 juin 2017 à 23:31:01

          Sebboulba a écrit:

          avant les boucles ?

          Sans les boucles ... et tout en une requête :

          SELECT
          	O.id,
          	OL.product_id,
          	OL.qty,
          	P.name_template,
          	A.att_id
          FROM
          	table_order O
          		INNER JOIN table_order_line OL
          			ON O.id = OL.order_id
          		INNER JOIN table_product P
          			ON OL.product_id = P.id
          		INNER JOIN table_attribute_value_product_product_rel A
          			ON P.id = A.prod_id
          WHERE
          	O.date_order>='$date_debut'
          	AND O.date_order<='$date_fin'
          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            24 juin 2017 à 2:48:05

            J'ai compris !!!

            C'est effectivement beaucoup beaucoup plus !

            Un immense merci Benzouye (aka Arturus ^^)

            • Partager sur Facebook
            • Partager sur Twitter

            Requete SQL multitable ?

            × 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