2012-01-05 2 views
0

В настоящее время у меня есть две таблицы, одна из которых - это продукты, а другая - параметры (цвет, размер и т. Д.). Если параметры не указаны для продукта, он ставит запас на стол продукции В противном случае он поставит акции против стола вариантMySQL Query - Добавление столбцов и строк

таблицы выглядят немного как это:

стол Продукт: ProductID, имя, складской учет, акции

Вариант таблица: optionid, ProductID, складской учет, акции

Я хочу, чтобы вытащить данные из обеих таблиц и сложить «запас»

До сих пор у меня есть это:

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

ответ

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` 
+0

Это хорошо работает. Спасибо! –

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 условие в избранных. Отредактировано! Подведем option.stock при наличии

+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` 
+0

Не мог бы заставить этот работать. –

+0

Я воспроизвел то, что вы сказали, и принятый ответ не дублировал уровни запасов. Как только для продукта указывается опция, запас на продукте устанавливается равным нулю и отключается. Так что это не должно быть проблемой. –

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

+0

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «EKSE SUM» ('option'.'stock')) AS' stock' FROM 'product' LEFT JOIN' option' ON ''в строке 3 –

+0

@ Rozée спасибо, я отредактировал. –

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` 
Смежные вопросы