2016-06-12 1 views
0

J'ai 5 tables contenant des produits et une table contenant la commande.Mysql plusieurs tables

CREATE TABLE `Prod1` (
    `idProd1` INT NOT NULL, 
    `name` VARCHAR(45) NULL, 
    `price` INT NULL, 
    PRIMARY KEY (`idProd1`)); 

Ceci est le modèle pour une table. J'ai 5 comme celui-ci.

Dans le 6 j'ai clé étrangère toute la clé primaire de la table des produits Je veux créer un select pour me donner le total à payer.

Le problème est que si l'une des clés est nulle, elle me renvoie le total de toutes les tables.

Ceci est ce que j'ai ti'll maintenant.

select p1.idprod1,p2.idprod2,p3.idprod3,p4.idprod4,p5.idprod5, sum(p1.idprod1+p2.idprod2+p3.idprod3+p4.idprod4+p5.idprod5) 
from prod1 p1,prod2 p2,prod3 p3,prod4 p4,prod5 p5,order o 
where p1.idprod1=o.iprod1 and p2.idprod2=o.idprod2 and p3.idprod3=o.idprod3 and p4.idprod=o.idprod4 and p5.idprod5=o.idprod5 and 
       o.idorder=(select max(idorder) from order); 

Répondre

0

Puisque vous avez where p1.idprod1=o.iprod1 and p2.idprod2=o.idprod2 and p3.idprod3=o.idprod3 and p4.idprod=o.idprod4 and p5.idprod5=o.idprod5 Je ne vois aucune raison de revenir p1.idprod1,p2.idprod2,p3.idprod3,p4.idprod4,p5.idprod5.

Autre remarque quelle est la raison de sum(p1.idprod1+p2.idprod2+p3.idprod3+p4.idprod4+p5.idprod5)? Je pense que la seule colonne que nous pouvons SUM est price.

Donc, mon approche est:

SELECT 
    o.*, 
    sum(p1.price+p2.price+p3.price+p4.price+p5.price) 
FROM order o 
LEFT JOIN prod1 p1 
ON p1.idprod1=o.iprod1 
LEFT JOIN prod2 p2 
p2.idprod2=o.idprod2 
LEFT JOIN prod3 p3 
ON p3.idprod3=o.idprod3 
LEFT JOIN prod4 p4 
ON p4.idprod=o.idprod4 
LEFT JOIN prod5 p5 
ON p5.idprod5=o.idprod5 
WHERE o.idorder=(select max(idorder) from order) 
GROUP BY o.idorder 
+0

Si j'ai un id nul ne fait plus la somme. La somme sur le prix. J'ai fait une erreur là-bas avec les ID –

0

J'utilisé Alex idée et un peu amélioré. J'ai sélectionné et les noms de mes produits. de la même manière, ifnull (p1.name, "-"), etc. Et si un identifiant est nul, il me renvoie le nom "-" et pour le prix 0. Peut-être que cela aidera quelqu'un.

SELECT 
    o.*, 
    sum(ifnull(p1.price,0)+ifnull(p2.price,0)+ 
     ifnull(p3.price,0)+ifnull(p4.price,0)+ifnull(p5.price,0)) 
FROM order o 
LEFT JOIN prod1 p1 
ON p1.idprod1=o.iprod1 
LEFT JOIN prod2 p2 
p2.idprod2=o.idprod2 
LEFT JOIN prod3 p3 
ON p3.idprod3=o.idprod3 
LEFT JOIN prod4 p4 
ON p4.idprod=o.idprod4 
LEFT JOIN prod5 p5 
ON p5.idprod5=o.idprod5 
WHERE o.idorder=(select max(idorder) from order) 
GROUP BY o.idorder