至少有 5 个直接下属的经理
LeetCode 570 · 分组计数、IN 子查询、自连接
面试怎么回答
先 GROUP BY ManagerId 加 HAVING COUNT(*) >= 5 得到经理 ID,再用 IN 或 JOIN 回员工表取姓名。我会顺手排除 ManagerId 为空的分组。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
员工表记录了每个员工的经理 ID。找出直接下属不少于 5 人的经理姓名。
表结构
- Employee:Id(主键)、Name、Department、ManagerId
思路
按 ManagerId 分组计数,HAVING 筛出下属数 ≥ 5 的经理 ID,再到员工表里取这些 ID 的姓名。也可以把分组结果和员工表 JOIN。
参考解法
select Name
from Employee
where Id in (
select ManagerId
from Employee
group by ManagerId
having count(*)>=5
)
易错点
- ManagerId 为 NULL 的员工也会形成一组,如果顶层员工很多可能被误判;可以加 WHERE ManagerId IS NOT NULL。