MySQL查询 - 添加列和&行

时间:2012-01-05 13:07:41

标签: php mysql sql database

我目前有两个表,一个是产品,另一个是选项(颜色,大小等)。 如果没有为产品指定选项,则会将库存放在产品表中 否则它将把股票放在期权表

表看起来有点像这样:

产品表: 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”

结果enter image description here

5 个答案:

答案 0 :(得分:1)

要处理NULL问题,需要将SUM包装在COALESCE中。

 SUM(`product`.`stock`) + COALESCE(SUM(`option`.`stock`), 0) AS `stock`

这是因为SUM(NULL)会产生NULLx + 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`