Сумма всех детей cols также, когда нет ребенка - PullRequest
0 голосов
/ 25 мая 2018

У меня есть таблица MySQL products, которая выглядит следующим образом:

|--------------------|
| id | parent | sold |
|--------------------|
| 1  | 0      | 1    |
| 2  | 1      | 3    |
| 3  | 1      | 0    |
| 4  | 0      | 2    |
|--------------------|

Я хочу получить результат того, сколько раз продукт был продан.Он также должен суммировать все дочерние столбцы продукта sold.Поэтому я попытался использовать запрос следующим образом:

SELECT
    p1.id,
    SUM(p2.sold) + p1.sold AS sold
FROM products p1
JOIN products p2
    ON p2.parent = p1.id
WHERE p1.parent = 0;

Но я получаю это:

|-----------|
| id | sold |
|-----------|
| 1  | 4    |
|-----------|

Так что это хорошо работает для первой записи, потому что у нее есть дети, а у четвертой записи нетдети.Мой ожидаемый результат таков:

|-----------|
| id | sold |
|-----------|
| 1  | 4    |
| 4  | 2    |
|-----------|

Ответы [ 4 ]

0 голосов
/ 25 мая 2018

Я бы порекомендовал left join и group by:

SELECT p1.id,
       (COALESCE(SUM(p2.sold), 0) + p1.sold) AS sold
FROM products p1 LEFT JOIN
     products p2
     ON p2.parent = p1.id
GROUP BY p1.id, p1.sold;

Вам нужно быть осторожным в значениях NULL для родителей, у которых нет детей.

0 голосов
/ 25 мая 2018

Вы хотите subquery:

select id, sum(sold) +
           ( select coalesce(sum(p1.sold), 0)
             from products p1
             where p1.parent = p.id
           ) as sold
from products p
where parent = 0
group by id;
0 голосов
/ 25 мая 2018

Это должно работать:

select a.id, sum(a.sold+coalesce(b.sold,0)) from products a left join(
select parent, sum(sold) sold
from products group by parent) b on a.id=b.parent
where a.parent=0
group by a.id
0 голосов
/ 25 мая 2018

Сделайте левое внешнее объединение и измените нулевые значения на 0, чтобы сумма не обнулялась.

SELECT
    p1.id,
    SUM(COALESCE(p2.sold,0)) + p1.sold AS sold
FROM products p1
LEFT JOIN products p2
    ON p2.parent = p1.id
WHERE p1.parent = 0
GROUP BY p1.id;

Как уже отмечалось, это решение не обрабатывает несколько уровней потомков.

Живая демоверсия по SQLFiddle

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