面试遇到一个题,如下所示:
给出每个部门员工薪水最高的员工信息emp_no, dept_no, salary
表1:dept_emp | |
---|---|
emp_no | 员工编号 |
dept_no | 部门编号 |
from_date | |
to_date |
表2:salaries | |
---|---|
emp_no | 员工编号 |
salary | 薪水 |
from_date | |
to_date |
刚开始写的是错误的答案,面试官也写错了,哈哈哈,感觉mysql水还是很深的,需要耐心去学习,首先给出错误答案:
错误答案
首先自己建了表,并插入数据
dept_emp表
salaries表
SELECT
a.emp_no,
a.dept_no,
b.salary,
a.from_data,
b.to_data,
MAX(salary)
FROM
dept_emp a
INNER JOIN salaries b ON a.emp_no = b.emp_no
GROUP BY
a.dept_no;
结果如下:
发现,部门2的薪水并非最高的,原因在于分组group by : 默认返回结果第一条,而max 只作用于列,不会影响行数据,所以才会出现此现象,因此我们先联表排序查询,再分组取
正确答案
SELECT
t.emp_no,
t.dept_no,
t.salary
FROM
(
SELECT
d.dept_no,
s.emp_no,
s.salary
FROM
dept_emp d
LEFT JOIN salaries s ON d.emp_no = s.emp_no
ORDER BY
s.salary DESC
) t
GROUP BY
t.dept_no;
结果可以看出,正是我们想要的结果