Php MySQL查询-添加列和行
我目前有两张桌子,一张是产品,另一张是颜色、尺寸等选项。 如果没有为产品指定选项,它会将库存放在产品表上 否则,它会将股票置于期权表上 表看起来有点像这样: 产品表: productid、名称、sku、库存 选项表: optionid、productid、sku、库存 我想从两个表中提取数据,并将股票相加 到目前为止,我有: 它以我想要的方式显示数据,但问题在于股票。 对于指定了选项的产品,它可以很好地将它们相加。 如果产品没有选项,它只显示NULL 结果尝试以下陈述:Php MySQL查询-添加列和行,php,mysql,sql,database,Php,Mysql,Sql,Database,我目前有两张桌子,一张是产品,另一张是颜色、尺寸等选项。 如果没有为产品指定选项,它会将库存放在产品表上 否则,它会将股票置于期权表上 表看起来有点像这样: 产品表: productid、名称、sku、库存 选项表: optionid、productid、sku、库存 我想从两个表中提取数据,并将股票相加 到目前为止,我有: 它以我想要的方式显示数据,但问题在于股票。 对于指定了选项的产品,它可以很好地将它们相加。 如果产品没有选项,它只显示NULL 结果尝试以下陈述: SELECT `prod
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`
我已经在select中设置了IF条件。
编辑!要对option.stock进行求和(如果可用)要处理空值问题,需要将求和封装在合并中
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`
SUM(`product`.`stock`) + COALESCE(SUM(`option`.`stock`), 0) AS `stock`
这是因为SUMNULL产生NULL,并且x+NULL=NULL。使用COALESCE将空值更改为0,得到x+0,等于x
我也看到了一个潜在的问题
如果一个产品可以有许多选项,左连接将导致产品记录重复,人为地增加库存
例如
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个
解决方案是分别为选项分组
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`
试试这个:
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。另一种方法是:
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`
它似乎忽略了将我的股票从期权表中加起来。1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在第3I行使用“EKSE sumpoption.stock AS stock FROM product LEFT JOIN option”的正确语法。我重复了您所说的,并且接受的答案没有重复库存水平。一旦针对某个产品指定了一个选项,该产品的库存就会设置为零并被禁用。所以这不应该是个问题。
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`