Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête SELECT avec LEFT JOIN et GROUP BY

Sujet résolu
    8 septembre 2020 à 8:37:31

    Bonjour à tous et à toutes,

    Je poste aujourd'hui pour savoir comment faire une requête car je n'arrive pas à avoir le résultat escompté.

    J'ai une table lm_produits qui contient des produits avec le détail sur chaque produit, une table odl_marques qui contient la marque du produit en question et j'ai une table odl_images_monture qui contient les images des produits.

    Tout est lié par des numéros.

    Le souci c'est qu'il y a plusieurs image par produit et que je voudrais afficher seulement la première.

    J'ai essayer la requête suivante mais l'image affichée n'est pas la première.

    <?php
    $affichage_produits = $bdd->prepare('SELECT id, nom_marq, nom_monture, nom_url, stock, nom_img_monture, odr_aff_img
    FROM lm_produits 
    LEFT JOIN odl_images_monture ON lm_produits.id = odl_images_monture.num_monture
    LEFT JOIN odl_marques ON lm_produits.marque = odl_marques.lien_marq 		
    WHERE collection = :coll GROUP BY nom_monture ORDER BY ordre_aff_prod, odr_aff_img ASC');
    $affichage_produits->bindValue('coll', $page, PDO::PARAM_STR);
    ?>

    Il y a bien qu'une image qui s'affiche mais le odr_aff_img n'est pas pris en compte.

    Si j’enlève le GROUP BY, les images sont dans l'ordre mais elles s'affichent toutes.

    Merci de votre aide.

    • Partager sur Facebook
    • Partager sur Twitter

    Création de site internet dansle7.fr Référencement et publicité gratuites sur commercesdu7.fr

      8 septembre 2020 à 11:08:48

      Bonjour,

      Déplacement vers un forum plus approprié

      Le sujet est déplacé de la section PHP vers la section Base de données

      sergio_zero a écrit:

      l'image affichée n'est pas la première

      Non, c'est une image au hasard ... un peu de lecture pour explication ...

      sergio_zero a écrit:

      je voudrais afficher seulement la première

      As-tu un moyen d'identifier "la première", l'enregistrement correspondant dans la table image a-t-il un signe distinctif ? id le plus petit ? date de création la plus petite ? colonne ordre = 1 ?

      Autres remarques :

      • N'utilises de jointures externes que lorsque c'est nécessaire
      • Utilises des alias pour simplifier l'écriture de la requête et améliorer la lisibilité pour les autres

      -
      Edité par Benzouye 8 septembre 2020 à 11:28:53

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        8 septembre 2020 à 13:01:02

         Bonjour Benzouye,

        Oui dans ma table image il y a ord_aff_img qui est un numéro d'ordre d'affichage mais il n'est pas pris en compte dans ma requête.

        • Partager sur Facebook
        • Partager sur Twitter

        Création de site internet dansle7.fr Référencement et publicité gratuites sur commercesdu7.fr

          8 septembre 2020 à 13:11:23

          sergio_zero a écrit:

          il n'est pas pris en compte dans ma requête.

          Oui, les explications dans le lien donné plus tôt.

          sergio_zero a écrit:

          il y a ord_aff_img qui est un numéro d'ordre d'affichage

          Je ne connais pas la structure des 3 tables en jeu (puisque tu n'utilises pas d'alias), donc je te propose ceci aux erreurs près de positionnement de champs :

          SELECT
          	P.id,
          	M.nom_marq,
          	P.nom_monture,
          	P.nom_url,
          	P.stock,
          	I.nom_img_monture,
          	I.odr_aff_img
          FROM
          	lm_produits AS P
          		INNER JOIN odl_marques AS M
          			ON P.marque = M.lien_marq      
          		LEFT JOIN (
          				-- Numéro mini par monture
          				SELECT
          					num_monture,
          					MIN( odr_aff_img ) AS img
          				FROM odl_images_monture
          				GROUP BY num_monture
          			) AS MI
          			ON P.id = MI.num_monture
          		LEFT JOIN odl_images_monture AS I
          			ON MI.num_monture = I.num_monture
          			AND MI.img = I.odr_aff_img
          WHERE P.collection = :coll
          GROUP BY P.nom_monture
          ORDER BY P.ordre_aff_prod

          Je fais une sous-requête pour calculer par monture le numéro d'affichage minimum, puis je joint tout cela au reste.

          J'ai mis une jointure interne (INNER) vers la table des marques car j'ai supposé que tout produit a une marque définie.

          J'ai mis une jointure externe (LEFT) vers les images pour quand même afficher les produits qui n'aurait pas d'image.

          Attention si pour une même monture il y a deux images avec le même odr_aff_img minimum, alors tu auras des doublons ... à toi de t'assurer que cela ne puisse se produire ...

          -
          Edité par Benzouye 8 septembre 2020 à 13:13:24

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            8 septembre 2020 à 13:54:52

            Merci pour ton aide, je vais essayer de comprendre et d'appliquer ta requête dès mon retour à la maison.

            Pour le numéro d'ordre d'affichage des images aucun problème de doublon, je met le numéro à l'insertion.

            Encore merci, je teste et edite ce soir.

            • Partager sur Facebook
            • Partager sur Twitter

            Création de site internet dansle7.fr Référencement et publicité gratuites sur commercesdu7.fr

              8 septembre 2020 à 14:35:24

              Ok.

              Je poste pour que tu puisses répondre à la suite ;)

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                8 septembre 2020 à 19:21:35

                Merci beaucoup Benzouye.

                J'ai juste ajusté ta requête et ça fonctionne parfaitement.

                Je vais aller lire quelque chose sur les requête avec AS INNER et LEFT histoire de bien comprendre.

                Encore merci.

                • Partager sur Facebook
                • Partager sur Twitter

                Création de site internet dansle7.fr Référencement et publicité gratuites sur commercesdu7.fr

                Requête SELECT avec LEFT JOIN et GROUP BY

                × 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