MySQL实现:统计父产品总销量(含子项,无子女项也需显示)
解决父产品总销量统计(含自身及子产品)的问题
嘿,我懂你的困扰——你现在用的INNER JOIN只会保留两张表都有匹配数据的行,所以像id=4这种没有子产品的父项就被自动过滤掉了。咱们调整下查询逻辑就能搞定:
修正后的查询语句
SELECT p1.id, p1.sold + COALESCE(SUM(p2.sold), 0) AS total_sold FROM products p1 LEFT JOIN products p2 ON p2.parent = p1.id WHERE p1.parent = 0 GROUP BY p1.id, p1.sold;
关键改动说明
- 换成
LEFT JOIN:它会保留p1里所有父产品的记录,哪怕对应的子产品表p2没有匹配数据(这时候p2的字段会显示为NULL) - 用
COALESCE处理NULL:当父产品没有子产品时,SUM(p2.sold)会返回NULL,COALESCE能把这个NULL转换成0,这样父产品自身的销量就能正常计算,不会出现异常结果 - 添加
GROUP BY:因为用到了聚合函数SUM,必须按父产品的id和sold字段分组,才能正确计算每个父产品的总销量
执行结果
这条查询会返回你期望的结果:
| id | total_sold |
|---|---|
| 1 | 4 |
| 4 | 2 |
内容的提问来源于stack exchange,提问作者Patrik Krehák
相关产品推荐
相关产品推荐

