LeetCode-1076. 项目员工II(简单)

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

知识点:

你可能感兴趣的:(语言,数据库)