我目前有两个表,一个是产品,另一个是选项(颜色,大小等)。 如果没有为产品指定选项,则会将库存放在产品表中 否则它将把股票放在期权表
上表看起来有点像这样:
产品表: productid,name,sku,stock
选项表: optionid,productid,sku,stock
我想从两个表中提取数据,然后加上“stock”
到目前为止我有这个:
SELECT `product`.`productid`, `product`.`name`, `product`.`sku`,
( SUM(`product`.`stock`) ) + ( SUM(`option`.`stock`) ) AS `stock`
FROM `product`
LEFT JOIN `option` ON `product`.`productid` = `option`.`productid`
GROUP BY `productid`
哪个显示我想要的数据,但问题在于库存。 对于具有指定选项的产品,它可以很好地添加它们。 如果产品没有选项,则只显示“NULL”
结果
答案 0 :(得分:1)
要处理NULL问题,需要将SUM包装在COALESCE中。
SUM(`product`.`stock`) + COALESCE(SUM(`option`.`stock`), 0) AS `stock`
这是因为SUM(NULL)
会产生NULL
,x + NULL
= NULL
。使用COALESCE将NULL
更改为0
,使x + 0
等于x
。
我也可以看到一个潜在的问题。
如果一个产品可以有多个选项,LEFT JOIN将导致产品记录重复,人为地夸大您的库存数量。
例如......
product id stock | option id stock
1 5 1 1
1 5 2 2
2 7 3 1
2 7 4 2
2 7 5 3
虽然产品1的库存是5,但是连接使它看起来像10.而对于产品2,它有7个库存,它看起来像21。
解决方案是分别为GROUP BY提供选项。
SELECT
`product`.`productid`,
`product`.`name`,
`product`.`sku`,
`product`.`stock` + COALESCE(`option`.`stock`, 0) AS `stock`
FROM
`product`
LEFT JOIN
(SELECT `productid`, SUM(`stock`) AS stock FROM `option` GROUP BY `productid`) as `option`
ON `option`.`productid` = `product`.`productid`
答案 1 :(得分:0)
试试这句话:
SELECT `product`.`productid`, `product`.`name`, `product`.`sku`,
IF(`option`.`stock`, SUM(`option`.`stock`), SUM(`product`.`stock`) ) AS `stock`
FROM `product`
LEFT JOIN `option` ON `product`.`productid` = `option`.`productid`
GROUP BY `productid`
我把IF条件放在select中。 编辑了!总结option.stock(如果可用)
答案 2 :(得分:0)
SELECT `product`.`productid`, `product`.`name`, `product`.`sku`,
IFNULL(SUM(`product`.`stock`),0) + IFNULL(SUM(`option`.`stock`),0) AS `stock`
FROM `product`
LEFT JOIN `option` ON `product`.`productid` = `option`.`productid`
GROUP BY `productid`
答案 3 :(得分:0)
试试这个:
SELECT `product`.`productid`, `product`.`name`, `product`.`sku`,
( SUM(`product`.`stock`) ) + ( CASE WHEN `option`.`stock` = NULL THEN 0 ELSE SUM(`option`.`stock`) ) AS `stock`
FROM `product`
LEFT JOIN `option` ON `product`.`productid` = `option`.`productid`
GROUP BY `productid`
问题在于,当您尝试添加NULL
时,结果为NULL
答案 4 :(得分:0)
另一种方法:
select `productid`, `name`, `sku`, sum(`stock`) `stock`
from (select `productid`, `name`, `sku`, `stock` FROM `product`
union all
select `productid`, '' `name`, '' `sku`, `stock` FROM `option`) v
GROUP BY `productid`