Mysql 通过子查询查找第二高工资

Mysql 通过子查询查找第二高工资,mysql,sql,Mysql,Sql,我有两张员工和部门的桌子 Employees表包含名称、薪资、部门id。 Departments表具有department\u id、department\u名称 我必须使用子查询显示工资第二高的员工(实际上,在employees表中,只有一名员工的工资第二高)及其部门名称 select max(e.salary), d.department_name from oehr_employees e join oehr_departments d on(e.department

我有两张员工和部门的桌子

Employees表包含名称、薪资、部门id。 Departments表具有department\u id、department\u名称

我必须使用子查询显示工资第二高的员工(实际上,在employees表中,只有一名员工的工资第二高)及其部门名称

select 
    max(e.salary),
    d.department_name 
from oehr_employees e 
join oehr_departments d on(e.department_id = d.department_id) 
where e.salary not in(
    select max(salary) from oehr_employees
) 
group by department_name
试着做这个,但它只显示了每个部门的第二高工资。不知道该怎么办:/


试图寻找答案,但没有完全得到我想要的。

如果你只是想要第二份更高的薪水,你可以使用限制和补偿

这不是一个有效的解决办法吗

select e.salary,d.department_name 
from oehr_employees e 
join oehr_departments d on(e.department_id = d.department_id)
ORDER BY e.salary DESC LIMIT 1 OFFSET 1

如果你想使用子查询,你可以试着像下面这样获得工资第二高的员工和部门的详细信息

select e.name,e.salary,d.department_id,d.department_name
 from 
 oehr_employees e
 join oehr_departments d on e.department_id = d.department_id
 WHERE  e.salary IN (SELECT Max(salary) 
                  FROM   oehr_employees 
                  WHERE  salary NOT IN (SELECT Max(salary) 
                                        FROM   oehr_employees)); 
使用行号:

SELECT * 
FROM (
    SELECT 
        e.employee_id,
        d.department_id,
        e.salary,
        ROW_NUMBER() OVER(ORDER BY e.salary DESC) rn
    FROM oehr_employees e 
    INNER JOIN oehr_departments d 
        ON e.department_id = d.department_id
) x WHERE rn = 2

我只需稍微修改您的查询并添加限制1:


这似乎满足了使用子查询的神秘要求。这是一个合理的方法。

在每个人或其部门员工中?子查询是简要说明的一部分?我需要通过子查询来完成。但是谢谢你提供了不同的解决方案。将编辑问题*如果有多个高薪人员怎么办?您可以按薪资分组,然后汇总部门名称。但如果是这样的话,也许使用窗口函数的解决方案会更好
select e.*, d.department_name
from oehr_employees e join
     oehr_departments d
     on e.department_id = d.department_id)
where e.salary < (select max(e2.salary) from oehr_employees e2) 
order by e.salary desc
limit 1;