[RESOLU] Boucle SUM a cause de LEFT JOIN

Petit nouveau ! | 9 Messages

14 déc. 2015, 20:37

Bonjour,

J'ai 3 tables.

Code : Tout sélectionner

commande: id_commande, id_client, ref_commande....../*comprend les infos et références de la commande.*/ commande_prod: id_commande_prod, id_commande, id_produit, tx_tva, prix_ht..../*comprend les produits et prix de commandes. (id_commande est utilisé pour la jointure)*/ piece_jointe: id_pj, id_comm, nom_fichier..../*peut contenir ou non des pièces jointes*/
Je cherche à afficher la somme totale par commande et afficher les pièces jointes ensembles si elles existent.

Mon code actuel:

Code : Tout sélectionner

SELECT DISTINCT c.ref_commande, SUM(cd.prix_ht * (1+(cd.tx_tva/100))) as ttc, GROUP_CONCAT(DISTINCT pj.nom_fichier)AS fichier FROM commande c INNER JOIN commande_prod cd USING(id_commande) LEFT JOIN piece_jointe pj ON c.id_commande=pj.id_comm WHERE c.id_client=44 GROUP BY c.id_commande
Ça fonctionne presque. Mon problème est que la somme est calculée autant de fois qu'il y a de pièces jointes.

Une idée svp?

Eléphant du PHP | 243 Messages

14 déc. 2015, 21:04

Bonjour,
Dans le cas où il existerait plusieurs pièces jointes pour une commande, je pense qu'il faudrait le faire en 2 requêtes.
Sinon, ça ressemblerait plus à ça :
SELECT Sum(prix_ht) somme,
       nom_fichier  piece
FROM   commande c,
       commande_prod cp,
       piece_jointe p
WHERE  c.id_commande = cp.id_commande
       AND c.id_commande = p.id_comm
GROUP  BY c.id_commande;
Je suis sans doute pas le meilleur en requête mais c'est ce qui me semble le plus simple. À vérifier !
"Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent"
~~Lorenzo Strigini

Petit nouveau ! | 9 Messages

14 déc. 2015, 21:43

Merci Ascla, mais j'ai eu une autre proposition qui me parait plus pertinente.
Pour ceux que ca pourrai aider:

Code : Tout sélectionner

SELECT s.*, GROUP_CONCAT(nom_fichier) AS fichiers FROM (SELECT c.id_commande, c.ref_commande, SUM(cd.prix_ht * (1+(cd.tx_tva/100))) as ttc FROM commande c INNER JOIN commande_prod cd USING(id_commande) WHERE c.id_client=44 GROUP BY c.id_commande ) s LEFT JOIN piece_jointe pj ON s.id_commande=pj.id_comm GROUP BY s.id_commande
Bonne soirée

Eléphant du PHP | 243 Messages

14 déc. 2015, 22:44

Ah je n'ai vraiment pas l'habitude de faire des requêtes de ce genre. :lol:

Bonne soirée.
"Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent"
~~Lorenzo Strigini