MySQL Query - Добавление столбцов и строк - PullRequest
0 голосов
/ 05 января 2012

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

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

Таблица продукции: productid, name, sku, stock

Таблица параметров: optionid, produktid, sku, 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 ]

1 голос
/ 05 января 2012

Чтобы справиться с проблемой 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`
0 голосов
/ 05 января 2012

Альтернативный подход:

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`
0 голосов
/ 05 января 2012

Попробуйте это:

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 голосов
/ 05 января 2012
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 голосов
/ 05 января 2012

Попробуйте это утверждение:

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, если имеется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...