如何在自连接分组计数时避免其他查询字段干扰结果?
问题分析与解决
你的问题出在自连接的关联逻辑搞反了,同时分组维度也没对应正确:
- 错误语句里用员工表
e左连经理表m,关联条件m.staff_id=e.manager_id,这是在给每个员工找他的直属经理,而非给经理统计下属数量。 - 后续分组时,虽然加了姓名,但每一行都是一个员工对应一个经理,
count(e.manager_id)只会统计当前行的非空值,结果自然全是1。
正确的SQL写法
要实现统计有下属的员工姓名及下属数量,应该换个关联逻辑:把表拆成「经理表」和「下属表」,让下属的manager_id关联到经理的staff_id,再按经理的信息分组计数下属数量:
-- 方法1:用INNER JOIN直接过滤出有下属的经理 SELECT m.first_name, m.last_name, COUNT(e.staff_id) AS '下属数量' FROM sales.staffs m INNER JOIN sales.staffs e ON e.manager_id = m.staff_id GROUP BY m.staff_id, m.first_name, m.last_name;
或者用LEFT JOIN配合HAVING过滤无下属的情况:
SELECT m.first_name, m.last_name, COUNT(e.staff_id) AS '下属数量' FROM sales.staffs m LEFT JOIN sales.staffs e ON e.manager_id = m.staff_id GROUP BY m.staff_id, m.first_name, m.last_name HAVING COUNT(e.staff_id) > 0;
为什么原来只查manager_id时结果正确?
你之前只查e.manager_id分组的语句,其实是把所有员工按他们的经理ID分组,统计每个经理手下的员工数——本质上是从下属的角度去统计,刚好歪打正着得到了正确的计数,但逻辑上和你要展示「经理姓名+下属数」的需求不匹配,一旦要加经理姓名就会出错。
内容的提问来源于stack exchange,提问作者user14474247
相关产品推荐
相关产品推荐

