LeetCode-1077. 项目员工 III(中等)

项目表 Project:

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| project_id  | int     |
| employee_id | int     |
+-------------+---------+
(project_id, employee_id) 是这个表的主键
employee_id 是员工表 Employee 的外键
员工表 Employee:

+------------------+---------+
| Column Name      | Type    |
+------------------+---------+
| employee_id      | int     |
| name             | varchar |
| experience_years | int     |
+------------------+---------+
employee_id 是这个表的主键
 

写 一个 SQL 查询语句,报告在每一个项目中经验最丰富的雇员是谁。如果出现经验年数相同的情况,请报告所有具有最大经验年数的员工。

查询结果格式在以下示例中:

Project 表:
+-------------+-------------+
| project_id  | employee_id |
+-------------+-------------+
| 1           | 1           |
| 1           | 2           |
| 1           | 3           |
| 2           | 1           |
| 2           | 4           |
+-------------+-------------+

Employee 表:
+-------------+--------+------------------+
| employee_id | name   | experience_years |
+-------------+--------+------------------+
| 1           | Khaled | 3                |
| 2           | Ali    | 2                |
| 3           | John   | 3                |
| 4           | Doe    | 2                |
+-------------+--------+------------------+

Result 表:
+-------------+---------------+
| project_id  | employee_id   |
+-------------+---------------+
| 1           | 1             |
| 1           | 3             |
| 2           | 1             |
+-------------+---------------+
employee_id 为 1 和 3 的员工在 project_id 为 1 的项目中拥有最丰富的经验。在 project_id 为 2 的项目中,employee_id 为 1 的员工拥有最丰富的经验。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/project-employees-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

审题:查询每个项目最有经验的人,如果时间相同,需要都查询出来。

思考:联合两个表,按照项目id和人员经验排序,获取最大的年限,需要注意重复。

扫描二维码关注公众号,回复: 9532503 查看本文章

解题:

解法一

先算出每个项目最高的经验年份。

连接项目表和员工表,对项目group by,求最高年份。

结果命名为表A。

-- 查询最高经验人员
select P.project_id,max(E.experience_years) as `most`
from Project as P join Employee as E on (P.employee_id = E.employee_id)
group by P.project_id;


(
    select P.project_id,max(E.experience_years) as `most`
    from Project as P join Employee as E on (P.employee_id = E.employee_id)
    group by P.project_id
) as A

再连接表A,项目表和员工表,求每个项目中,与最高年份相等的员工

-- 连接项目表和员工表,查询与最高年限相同的人。

select P.project_id,P.employee_id from Project as P
join (
select P.project_id,max(E.experience_years) as `most` from Project as P join Employee as 
Eon (P.employee_id = E.employee_id)
    group by P.project_id
) as A
    on (P.project_id = A.project_id)  join Employee as E on
(P.employee_id = E.employee_id and A.most = E.experience_years)


-- 官方

select P.project_id,P.employee_id
from Project as P
join
(
    select P.project_id,max(E.experience_years) as `most`
    from Project as P join Employee as E on (P.employee_id = E.employee_id)
    group by P.project_id
) as A
    on (P.project_id = A.project_id)
join Employee as E
    on (P.employee_id = E.employee_id and A.most = E.experience_years)

解法二

对每个项目中的每个人,判断其是否是最高年份的员工。

求每个项目的最高年份,方法同解法一。

select max(E1.experience_years) as `most`
from Project as P1 join Employee as E1
on P1.employee_id = E1.employee_id
group by P1.project_id

判断每个人是否是项目中的年份最高的人。应用IN。

select P.project_id,E.employee_id
from Project as P join Employee as E
on P.employee_id = E.employee_id
where E.experience_years in (
    select max(E1.experience_years) as `most`
    from Project as P1 join Employee as E1
    on P1.employee_id = E1.employee_id
    where P1.project_id = P.project_id
    group by P1.project_id
)

知识点:

可以使用join,或者使用in.

发布了118 篇原创文章 · 获赞 2 · 访问量 4893

猜你喜欢

转载自blog.csdn.net/Hello_JavaScript/article/details/104387238
今日推荐