Чтобы справиться с проблемой NULL, вам нужно обернуть сумму в COALESCE.
SUM(`product`.`stock`) + COALESCE(SUM(`option`.`stock`), 0) AS `stock`
Это потому, что SUM(NULL)
дает NULL
, а x + NULL
= NULL
. Использование COALESCE изменяет NULL
на 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.
1025 *
*
Решением является 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`