我有一个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 |
|-----------|
答案 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;
如上所述,此解决方案无法处理多个级别的孩子。
答案 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 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
对于没有孩子的父母,您需要注意Style
值。