题目链接: 570.至少有5名直接下属的经理
方法一:
思路
由题意可知,所有员工(不管普通员工还是经理)都在一张表中(Employee
),很显然,表的关联关系为 自我引用。这时首选 多表查询中的 JOIN 连接,然后添加过滤条件。
解题过程
题目要求:找出至少有五个直接下属的经理,首先利用匹配字段 e1.id = e2.managerId
进行连接(使用 e1.id = e2.managerId
就会筛选出经理)。连接类型选择左连接,为啥使用左连接呢?因为要弄出所有员工的信息,可是直接筛选出经理不好嘛?(有道理,其实直接用JOIN
更好,而不是使用LEFT JOIN
)
SELECT *
FROM Employee e1
LEFT JOIN Employee e2
ON e1.id = e2.managerId
查看结果记录表,总结出过滤条件,对name
进行分组(GROUP BY e1.name
),然后判断name
的数量是否大于5(MIN(name) >= 5
),额…其实这是个坑,表中唯一的主键是id,所以经理可以有多个id。所以对name
进行过滤改为对id进行过滤即可。
Code
SELECT e1.name
FROM Employee e1
LEFT JOIN Employee e2
ON e1.id = e2.managerId
GROUP BY e1.id
HAVING COUNT(e1.id) >= 5;
方法二:
思路
不使用JOIN,但还是多表查询, FROM Employee e1, Employee e2
其实也是笛卡尔积,关于更多 FROM Employee e1, Employee e2
的小秘密,请移步至 MySQL零散拾遗(六)---- 对 FROM table1,table2 要点进行详细介绍
解题过程
题目要求:找出至少有五个直接下属的经理,直接使用 e1.id = e2.managerId
就会筛选出经理。再判断是否满足经理的要求即可
Code
SELECT e1.name
FROM Employee e1, Employee e2
WHERE e1.id = e2.managerId
GROUP BY e1.id
HAVING COUNT(e1.id) >= 5