MySQL单表多统计查询异常:parent_child_count统计值错误求助
问题分析与解决方案
我来帮你梳理下问题:你遇到的parent_child_count始终返回1的问题,根源在第二个子查询的逻辑错误。你原来写的第二个子查询:
SELECT id,COUNT(id) AS parent_child_count FROM market GROUP BY id
这里按id分组后,COUNT(id)统计的是每个id自身的行数(因为每个id都是唯一的,所以结果必然是1),但你实际需要的是当前行父节点拥有的子节点总数——这其实和你计算child_count的逻辑完全一致,只是关联的对象不同。
修正后的查询语句
你可以直接复用计算child_count的子查询逻辑,只需要调整关联条件即可:
SELECT m1.*, m2.child_count, m3.parent_child_count FROM market AS m1 LEFT OUTER JOIN ( SELECT parent_id, COUNT(id) AS child_count FROM market GROUP BY parent_id ) AS m2 ON m1.id = m2.parent_id LEFT OUTER JOIN ( -- 这里和child_count的子查询逻辑一致,统计每个节点的子节点数 SELECT parent_id, COUNT(id) AS parent_child_count FROM market GROUP BY parent_id ) AS m3 ON m1.parent_id = m3.parent_id ORDER BY code ASC;
如果想要代码更简洁易维护,也可以用CTE(公共表表达式)来复用子查询逻辑:
WITH node_child_counts AS ( SELECT parent_id, COUNT(id) AS child_count FROM market GROUP BY parent_id ) SELECT m1.*, ncc1.child_count, ncc2.child_count AS parent_child_count FROM market m1 LEFT JOIN node_child_counts ncc1 ON m1.id = ncc1.parent_id LEFT JOIN node_child_counts ncc2 ON m1.parent_id = ncc2.parent_id ORDER BY m1.code ASC;
正确的查询结果
执行上面的修正语句后,你会得到符合预期的结果:
| id | code | parent_id | child_count | parent_child_count |
|---|---|---|---|---|
| 1 | aaaa | 0 | 2 | NULL |
| 2 | bbbb | 1 | NULL | 2 |
| 3 | cccc | 1 | NULL | 2 |
这样parent_child_count就会正确显示当前行父节点的子节点数量了。
内容的提问来源于stack exchange,提问作者Mystral
相关产品推荐
相关产品推荐

