Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jointure - Un left join à caser...

Sujet résolu
    21 octobre 2017 à 14:18:58

    Bonjour,

    Je bute sur un dernier paramètre. Il me manque un GROUP BY j.id_convoyeur que je n'arrive pas à mettre en place. Si quelqu'un a une idée...

    D'avance, merci.

    SELECT j.id id_stock, j.code_stock, j.id_convoyeur, j.id_fournisseur, j.stock_fabriquant, j.stock_nomenclature, j.stock_en_cours,
    	k.id, k.id_member, k.secteur, k.number, k.designation, k.stock_mini,
    		m.id, m.societe,
    						md.code_stock, md.stock_cumul_en_cours
    FROM stock j
    	LEFT JOIN convoyeur k ON k.id=j.id_convoyeur 
    		LEFT JOIN fournisseur m ON m.id=j.id_fournisseur 
    			LEFT JOIN (SELECT SUM(stock_en_cours) AS stock_cumul_en_cours, code_stock FROM stock GROUP BY code_stock) AS md ON j.code_stock = md.code_stock 
    WHERE k.id_member = '.$_SESSION['id'].'

    THERESE (euh pardon, EDITH)

    J'ai fait ainsi et ça fonctionne. Mais n'y a t'il par plus propre ?

    SELECT SUM(stock_en_cours) AS stock_commande_en_cours, code_stock, j.id_convoyeur, stock_fabriquant, stock_nomenclature, id_fournisseur,
    	k.id, k.id_member, k.secteur, k.number, k.designation, k.stock_mini,
    		m.id, m.societe,
    			z.stock_cumul_en_cours
    FROM stock j
    	LEFT JOIN convoyeur k ON k.id=j.id_convoyeur 
    		LEFT JOIN fournisseur m ON m.id=j.id_fournisseur 
    			LEFT JOIN (SELECT id_convoyeur, SUM(stock_en_cours) AS stock_cumul_en_cours FROM stock GROUP BY id_convoyeur) z ON z.id_convoyeur=j.id_convoyeur
    WHERE k.id_member='.$_SESSION['id'].'
    	GROUP BY code_stock, id_convoyeur, stock_fabriquant, stock_nomenclature, id_fournisseur




    -
    Edité par BenoîtDESCOURS 21 octobre 2017 à 16:56:00

    • Partager sur Facebook
    • Partager sur Twitter
      21 octobre 2017 à 17:25:46

      Bonjour,

      BenoîtDESCOURS a écrit:

      n'y a t'il par plus propre ?

      La syntaxe est correcte mais perfectible.

      Le premier LEFT JOIN est inutile car je suppose qu'un stock est forcément associé à un seul convoyeur ... d'autant que comme tu mets une condition sur la table convoyeur dans ta clause WHERE cela rend la jointure externe obligatoire donc inutile ...

      De même pour le deuxième LEFT JOIN, puisque l'on peut aussi supposer qu'un stock est forcément lié à un seul fournisseur ...

      De même pour le troisième LEFT JOIN, puisque l'on peut aussi supposer que si un stock existe pour un id_member, il aura aussi une somme pour tous les id_member (c'est l'objet de ta sous-requête non ?) ...

      Après je ne sais pas comment tu as choisi les colonnes de ton GROUP BY, mais c'est un peu aléatoire non ... avec MySQL, soit tu mets seulement les clés primaires permettant le regroupement, soit tu mets toutes les colonnes à regrouper ...

      SELECT
      	SUM(j.stock_en_cours) AS stock_commande_en_cours,
      	j.code_stock,
      	j.id_convoyeur,
      	j.stock_fabriquant,
      	j.stock_nomenclature,
      	j.id_fournisseur,
          k.id,
      	k.id_member,
      	k.secteur,
      	k.number,
      	k.designation,
      	k.stock_mini,
      	m.id,
      	m.societe,
      	z.stock_cumul_en_cours
      FROM
      	stock j
      		INNER JOIN convoyeur k
      			ON k.id=j.id_convoyeur
      		INNER JOIN fournisseur m
      			ON m.id=j.id_fournisseur
      		INNER JOIN (
      				SELECT id_convoyeur, SUM(stock_en_cours) AS stock_cumul_en_cours
      				FROM stock
      				GROUP BY id_convoyeur
      			) z
      			ON z.id_convoyeur=j.id_convoyeur
      WHERE k.id_member='.$_SESSION['id'].'
      GROUP BY
      	j.code_stock,
      	j.id_convoyeur,
      	j.id_fournisseur
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        21 octobre 2017 à 19:10:54

        MySQL me retourner une erreur :

        MySQL a répondu: Documentation

        #1055 - Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated

        column 'mysara.j.stock_fabriquant' which is not functionally dependent on columns in

        GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

        -
        Edité par BenoîtDESCOURS 21 octobre 2017 à 19:11:15

        • Partager sur Facebook
        • Partager sur Twitter
          22 octobre 2017 à 9:19:51

          Benzouye a écrit:

           soit tu mets toutes les colonnes à regrouper ...

          Si tu as cette erreur c'est donc qu'il te faut faire la liste complète de tes colonnes du SELECT dans le group by. ..

          Cf. Option only full group by 

          • 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 octobre 2017 à 21:14:38

            Bonsoir,

            Je conserve mon code mais le hic, c'est que je ne sais pas comment intégrer j.id dans ma requête sans la faire planter...

            Si tu as une idée...

            Merci.

            • Partager sur Facebook
            • Partager sur Twitter
              23 octobre 2017 à 9:46:42

              BenoîtDESCOURS a écrit:

              comment intégrer j.id dans ma requête sans la faire planter

              En essayant de comprendre mes remarques et le fonctionnement de la clause ORDER BY avec l'option ONLY_FULL_GROUP_BY de MySQL ...

              Du coup :

              SELECT
              	SUM(j.stock_en_cours) AS stock_commande_en_cours,
              	j.id,
              	j.code_stock,
              	j.id_convoyeur,
              	j.stock_fabriquant,
              	j.stock_nomenclature,
              	j.id_fournisseur,
              	k.id,
              	k.id_member,
              	k.secteur,
              	k.number,
              	k.designation,
              	k.stock_mini,
              	m.id,
              	m.societe,
              	z.stock_cumul_en_cours
              FROM
              	stock j
              		INNER JOIN convoyeur k
              			ON k.id=j.id_convoyeur
              		INNER JOIN fournisseur m
              			ON m.id=j.id_fournisseur
              		INNER JOIN (
              				SELECT id_convoyeur, SUM(stock_en_cours) AS stock_cumul_en_cours
              				FROM stock
              				GROUP BY id_convoyeur
              			) z
              			ON z.id_convoyeur=j.id_convoyeur
              WHERE k.id_member='.$_SESSION['id'].'
              GROUP BY
              	j.id,
              	j.code_stock,
              	j.id_convoyeur,
              	j.stock_fabriquant,
              	j.stock_nomenclature,
              	j.id_fournisseur,
              	k.id,
              	k.id_member,
              	k.secteur,
              	k.number,
              	k.designation,
              	k.stock_mini,
              	m.id,
              	m.societe,
              	z.stock_cumul_en_cours
              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                23 octobre 2017 à 20:25:52

                Super ainsi, en effet.

                -
                Edité par Benzouye 26 octobre 2017 à 17:59:31

                • Partager sur Facebook
                • Partager sur Twitter

                Jointure - Un left join à caser...

                × 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