当没有孩子时,所有孩子的总和也是

时间:2018-05-25 15:11:09

标签: sql mariadb

我有一个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 :(得分:1)

将其设为左外连接,并将空值更改为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;

如上所述,此解决方案无法处理多个级别的孩子。

Live demo on SQLFiddle

答案 1 :(得分:1)

您想要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;

答案 2 :(得分:1)

这应该有效:

left join

答案 3 :(得分:1)

我建议使用group bySELECT 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

对于没有孩子的父母,您需要注意Style值。