如何在子查询中使用主查询列?层级用户数统计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)避免重复统计。
验证结果
用你提供的示例数据测试,两种方案都会输出你期望的结果:
| id | nickname | level_1 | level_2 |
|---|---|---|---|
| 1 | AAA | 1 | 2 |
| 2 | BBB | 2 | 0 |
| 3 | CCC | 0 | 0 |
| 4 | DDD | 0 | 0 |
内容的提问来源于stack exchange,提问作者René Beneš
相关产品推荐
相关产品推荐

