You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

正确的查询结果

执行上面的修正语句后,你会得到符合预期的结果:

idcodeparent_idchild_countparent_child_count
1aaaa02NULL
2bbbb1NULL2
3cccc1NULL2

这样parent_child_count就会正确显示当前行父节点的子节点数量了。

内容的提问来源于stack exchange,提问作者Mystral

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:22:59