Employee 表包含所有员工和他们的经理。每个员工都有一个 Id,并且还有一列是经理的 Id。
+
|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 |
+
给定 Employee 表,请编写一个SQL查询来查找至少有5名直接下属的经理。对于上表,您的SQL查询应该返回:
+
| Name
|
+
| John
|
+
注意:
没有人是自己的下属。
题目条件
DROP TABLE IF EXISTS `employee
`;
CREATE TABLE `employee
` (
`Id
` int(11) DEFAULT NULL,
`Name
` varchar(20) COLLATE utf8_bin
DEFAULT NULL,
`Department
` varchar(20) COLLATE utf8_bin
DEFAULT NULL,
`ManagerId
` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
COLLATE=utf8_bin
;
insert into `employee
`(`Id
`,`Name
`,`Department
`,`ManagerId
`) values (101,'John ','A',NULL),(102,'Dan','A',101),(103,'James','A',101),(104,'Amy','A',101),(105,'Anne','A',101),(106,'Ron','B',101);
使用count()函数和group by分句
算法
首先,我们只需使用count()函数对 ManagerId 列就可以获取拥有 5 个以上直接下属的经理的 ID,做临时表e。然后,根据临时表e中经理的ID,在Employee 表中查找拥有 5 个以上直接下属经理的名字(Name属性)即可。
SELECT `Name
` FROM`employee
`
WHERE `Id
` IN
(SELECT `ManagerId
` FROM
(SELECT `ManagerId
`,COUNT(`ManagerId
`) FROM`employee
` GROUP BY `ManagerId
`)
AS e
) ;
结果
来源:力扣(LeetCode)
上一题:182. 查找/删除重复的电子邮箱