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

如何在子查询中使用主查询列?层级用户数统计SQL报错排查

解决子查询引用主查询列的问题,统计各层级子用户数

嘿,我来帮你理清楚这个问题~你遇到的Unknown column 'c.id' in 'where clause'错误,核心原因是你的子查询没有和主表建立关联关系,内层子查询无法访问外层主查询的c.id列。

你的原语句问题分析

你用逗号把主表c和子查询c2拼接在一起,这时候c2里的两个子查询是独立执行的,完全不知道外层主表c的存在,自然识别不了c.id。这种写法相当于把两个无关的结果集做笛卡尔积,逻辑上也不符合你要统计每个用户子用户数的需求。

正确的实现方式

这里提供两种常用的解决方案,都能让子查询正确引用主查询的列:

方案1:使用关联子查询(直观易懂)

直接在SELECT子句中嵌入关联子查询,每个子查询都通过WHERE条件和主表c关联,这样就能拿到当前用户的id去统计对应层级的子用户:

SELECT 
    c.id,
    c.nickname,
    -- 统计一级子用户(直接下级)
    (SELECT COUNT(*) FROM favor_customer u WHERE u.parent_id = c.id) AS level_1,
    -- 统计二级子用户(下级的下级)
    (SELECT COUNT(*) 
     FROM favor_customer u 
     JOIN favor_customer uc ON uc.parent_id = u.id 
     WHERE u.parent_id = c.id) AS level_2
FROM favor_customer c;

方案2:使用LEFT JOIN + GROUP BY(性能更优)

如果你的用户数据量较大,多次关联子查询可能效率不高,推荐用两次LEFT JOIN分别关联一级、二级子用户,再通过聚合函数统计数量:

SELECT 
    c.id,
    c.nickname,
    COUNT(u.id) AS level_1, -- 一级子用户数
    COUNT(uc.id) AS level_2 -- 二级子用户数
FROM favor_customer c
-- 关联一级子用户
LEFT JOIN favor_customer u ON u.parent_id = c.id
-- 关联二级子用户(一级子用户的下级)
LEFT JOIN favor_customer uc ON uc.parent_id = u.id
GROUP BY c.id, c.nickname;

注:如果存在用户被多个上级关联的特殊场景(你的示例里没有这种情况),可以用COUNT(DISTINCT u.id)避免重复统计。

验证结果

用你提供的示例数据测试,两种方案都会输出你期望的结果:

idnicknamelevel_1level_2
1AAA12
2BBB20
3CCC00
4DDD00

内容的提问来源于stack exchange,提问作者René Beneš

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:03:01