570. 至少有5名直接下属的经理

表: Employee

1
2
3
4
5
6
7
8
9
10
11
12
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| name | varchar |
| department | varchar |
| managerId | int |
+-------------+---------+
id 是此表的主键(具有唯一值的列)。
该表的每一行表示雇员的名字、他们的部门和他们的经理的id。
如果managerId为空,则该员工没有经理。
没有员工会成为自己的管理者。

编写一个解决方案,找出至少有五个直接下属的经理。

任意顺序 返回结果表。

查询结果格式如下所示。

示例 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
输入: 
Employee 表:
+-----+-------+------------+-----------+
| id | name | department | managerId |
+-----+-------+------------+-----------+
| 101 | John | A | Null |
| 102 | Dan | A | 101 |
| 103 | James | A | 101 |
| 104 | Amy | A | 101 |
| 105 | Anne | A | 101 |
| 106 | Ron | B | 101 |
+-----+-------+------------+-----------+
输出:
+------+
| name |
+------+
| John |
+------+

解题思路

核心思路是 “先统计下属数量,再匹配经理信息”

  1. 统计下属数量:按 managerId 分组(managerId 对应经理的 id),计数每个经理的直接下属数量,筛选出下属数 ≥5 的 managerId
  2. 匹配经理姓名:将上述筛选结果与 Employee 表自身关联(通过 managerId = id),获取这些经理的 name

代码实现(SQL )

1
2
3
4
5
6
7
SELECT e1.name
FROM Employee e1
-- 自连接:e1是经理(id = e2.managerId),e2是下属
JOIN Employee e2 ON e1.id = e2.managerId
-- 按经理分组,统计下属数量≥5
GROUP BY e1.id, e1.name -- 按主键id分组,避免同名经理重复
HAVING COUNT(e2.id) >= 5;