这道题有三种解法
image.png思路一(不推荐):
假定最晚入职员工是只有一个人,可以利用对 hire_date
字段进行降序排序,那么排序第一行数据正是我们所要找的数据,这时候利用 limit 0,1
进行分页(0指的是第一页!1是指一页只显示一条信息)
select *
from employees
order by hire_date desc
limit 0,1;
思路2:
这次我们不再假定只有一个人,而是预估最晚入职的人可能是多个人,所以需要找到 hire_date
的最大值,只要 hire_date
等于最大值,则查询出来对应的所有信息,自己比较自己的最大值立即推子查询
select *
from employees
where `hire_date` = (
select max(`hire_date`)
from employees
);
思路3(强推):
这个思路是由力扣的数据库第185题-部门工资前三高的员工的排名题解排名第二启发的,这里需要换一个思维。最晚入职 意思是hire_date
的最大值。此时需要“我”影分身“你”,这里,“我”和“你”都是同一张表的不同别名。那么要找“我”的hire_date
的最大值,也就是说“你”比我大的数量是0(即在我前面的数据是0条)。这里注意要用自己比较自己的最大值立即推子查询,而且要加别名“我”(即e1)和“你”(即e2)。
select *
from employees e1
where 0 = (
select count(distinct e2.`hire_date`)
from employees e2
where e2.`hire_date` > e1.`hire_date`
);
One More Thing
进阶一点的题就是leetcode的第185题
思路是一样的,e1=e2=employees,找出排名前三的,也就是“你”比“我”大的数据条数小于3,记住不能是小于等于,因为等于的话意味着在“我”前面有三个人,那我不就第四名了。
select d.Name Department,e1.Name Employee,e1.Salary Salary
from Employee e1
join Department d on e1.DepartmentID=d.Id
where 3 > (
select count(distinct e2.Salary)
from Employee e2
where e2.Salary > e1.Salary and e1.DepartmentID=e2.DepartmentID
);
当然这道题还有更加优雅的方法,利用开窗函数解决,详情请见leetcode数据库第185题
网友评论