项目表 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和人员经验排序,获取最大的年限,需要注意重复。
解题:
解法一
先算出每个项目最高的经验年份。
连接项目表和员工表,对项目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.