Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL查询-添加列和行_Php_Mysql_Sql_Database - Fatal编程技术网

Php MySQL查询-添加列和行

Php MySQL查询-添加列和行,php,mysql,sql,database,Php,Mysql,Sql,Database,我目前有两张桌子,一张是产品,另一张是颜色、尺寸等选项。 如果没有为产品指定选项,它会将库存放在产品表上 否则,它会将股票置于期权表上 表看起来有点像这样: 产品表: productid、名称、sku、库存 选项表: optionid、productid、sku、库存 我想从两个表中提取数据,并将股票相加 到目前为止,我有: 它以我想要的方式显示数据,但问题在于股票。 对于指定了选项的产品,它可以很好地将它们相加。 如果产品没有选项,它只显示NULL 结果尝试以下陈述: SELECT `prod

我目前有两张桌子,一张是产品,另一张是颜色、尺寸等选项。 如果没有为产品指定选项,它会将库存放在产品表上 否则,它会将股票置于期权表上

表看起来有点像这样:

产品表: productid、名称、sku、库存

选项表: optionid、productid、sku、库存

我想从两个表中提取数据,并将股票相加

到目前为止,我有:

它以我想要的方式显示数据,但问题在于股票。 对于指定了选项的产品,它可以很好地将它们相加。 如果产品没有选项,它只显示NULL

结果

尝试以下陈述:

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`