Mysql 多个表
Mysql multiple tables
我有 5 table 个包含产品和一个 table 个包含订单。
CREATE TABLE `Prod1` (
`idProd1` INT NOT NULL,
`name` VARCHAR(45) NULL,
`price` INT NULL,
PRIMARY KEY (`idProd1`));
这是一个 table 的模型。我有5个这样的。
在 6 中我有产品的所有主键外键 table
我想创建一个 select 来给我支付的总额。
问题是,如果其中一个键为空,则返回所有 table 的总数。
这就是我现在拥有的。
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);
既然你有 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
我看不出有任何理由 return p1.idprod1,p2.idprod2,p3.idprod3,p4.idprod4,p5.idprod5
.
另外注意是什么原因sum(p1.idprod1+p2.idprod2+p3.idprod3+p4.idprod4+p5.idprod5)
?
我认为我们唯一可以 SUM
的专栏是 price
。
所以我的做法是:
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
我用了Alex的idea,改进了一点。
我从我的产品中选择了名称。以同样的方式,ifnull(p1.name,"-"), 等。如果 id 为 null,则返回我的名称破折号“-”和价格 0。也许它会对某人有所帮助。
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
我有 5 table 个包含产品和一个 table 个包含订单。
CREATE TABLE `Prod1` (
`idProd1` INT NOT NULL,
`name` VARCHAR(45) NULL,
`price` INT NULL,
PRIMARY KEY (`idProd1`));
这是一个 table 的模型。我有5个这样的。
在 6 中我有产品的所有主键外键 table 我想创建一个 select 来给我支付的总额。
问题是,如果其中一个键为空,则返回所有 table 的总数。
这就是我现在拥有的。
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);
既然你有 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
我看不出有任何理由 return p1.idprod1,p2.idprod2,p3.idprod3,p4.idprod4,p5.idprod5
.
另外注意是什么原因sum(p1.idprod1+p2.idprod2+p3.idprod3+p4.idprod4+p5.idprod5)
?
我认为我们唯一可以 SUM
的专栏是 price
。
所以我的做法是:
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
我用了Alex的idea,改进了一点。 我从我的产品中选择了名称。以同样的方式,ifnull(p1.name,"-"), 等。如果 id 为 null,则返回我的名称破折号“-”和价格 0。也许它会对某人有所帮助。
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