Table: Project
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| project_id | int |
| employee_id | int |
+-------------+---------+
主键为 (project_id, employee_id)。
employee_id 是员工表 Employee 表的外键。
Table: Employee
+------------------+---------+
| Column Name | Type |
+------------------+---------+
| employee_id | int |
| name | varchar |
| experience_years | int |
+------------------+---------+
主键是 employee_id。
编写一个SQL查询,报告所有雇员最多的项目。
查询结果格式如下所示:
Project table:
+-------------+-------------+
| project_id | employee_id |
+-------------+-------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 4 |
+-------------+-------------+
Employee table:
+-------------+--------+------------------+
| employee_id | name | experience_years |
+-------------+--------+------------------+
| 1 | Khaled | 3 |
| 2 | Ali | 2 |
| 3 | John | 1 |
| 4 | Doe | 2 |
+-------------+--------+------------------+
Result table:
+-------------+
| project_id |
+-------------+
| 1 |
+-------------+
第一个项目有3名员工,第二个项目有2名员工。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/project-employees-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
审题:查询雇员最多的项目
思考:按照项目表,项目分组,排序,查找第一个,需要判断项目人数一样多的问题。
解题:
解法一
先算出每个项目的员工数。应用group by分组。
(
SELECT P.project_id,count(distinct P.employee_id) as `cnt`
from Project as P
group by P.project_id
) AS A
再求所有项目中最多的人数。
在上面基础上,降序排,取第一个。
(
SELECT count(distinct P.employee_id) as `cnt`
from Project as P
group by P.project_id
order by cnt desc
limit 0,1
) AS B
连接表A和表B,选出员工数等于最大值的项目。
SELECT A.project_id
FROM
(
SELECT P.project_id,count(distinct P.employee_id) as `cnt`
from Project as P
group by P.project_id
) AS A
JOIN
(
SELECT count(distinct P.employee_id) as `cnt`
from Project as P
group by P.project_id
order by cnt desc
limit 0,1
) AS B
ON(A.cnt = B.cnt)
GROUP BY A.project_id
解法二
先求最多的人数。
逻辑同解法一。
(
SELECT count(distinct P.employee_id) as `cnt`
from Project as P
group by P.project_id
order by cnt desc
limit 0,1
) AS B
项目表与表B叉积,对项目分组,计算每个组的人数,选出每组人数等于最多人数的行。
SELECT A.project_id
from Project AS A,
(
SELECT count(distinct P.employee_id) as `cnt`
from Project as P
group by P.project_id
order by cnt desc
limit 0,1
) AS B
GROUP BY A.project_id
having COUNT(distinct A.employee_id) = MAX(B.cnt)
注意:having子句中用到MAX(B.cnt)。由于group by只对A.project_id分组。B.cnt不能直接用在“=”之后,尽管每行的B.cnt相等。需要将B.cnt包装在聚集函数中。此处选了MAX。或者将group by改为对A.project_id和B.cnt分组,B.cnt就可以直接用在having子句中。
SELECT A.project_id
from Project AS A,
(
SELECT count(distinct P.employee_id) as `cnt`
from Project as P
group by P.project_id
order by cnt desc
limit 0,1
) AS B
GROUP BY A.project_id,B.cnt
having COUNT(distinct A.employee_id) = B.cnt
知识点: