MYSQL查询查找具有第n个最高薪水的所有员工

这两个表是salary_employee和employee

employee_salary

salary_id  emp_id  salary

雇员

emp_id |    first_name | last_name |    gender  | email | mobile  | dept_id  | is_active

查询以获得具有n个最高薪水的所有员工,其中n = 1,2,3,…任何整数

SELECT  a.salary, b.first_name 
FROM    employee_salary a 
JOIN    employee b 
ON      a.emp_id = b.emp_id 
WHERE   a.salary = (
                      SELECT    salary 
                      FROM      employee_salary  
                      GROUP BY  salary 
                      DESC     
                      LIMIT 1 OFFSET N-1
                   )

我的问题:

1)有没有更好的和优化的方式我们可以查询,

2)使用LIMIT是一个不错的选择

3)我们有更多的选择来计算第n个最高工资,这是最好的,什么可以遵循什么时候?

一个选项使用:

SELECT *
   FROM employee_salary t1
   WHERE ( N ) = ( SELECT COUNT( t2.salary )
                   FROM employee_salary t2 
                   WHERE  t2.salary >=  t1.salary 
                 )

使用秩方法

SELECT salary
FROM
(
  SELECT @rn := @rn + 1 rn,
       a.salary
  FROM tableName a, (SELECT @rn := 0) b
  GROUP BY salary DESC
) sub
WHERE sub.rn = N
最佳答案
这个评论太长了.

你问过什么似乎是一个合理的问题.在SQL中有不同的处理方式,有时候某些方法比其他方法更好.排名问题只是许多例子中的一个.你的问题的“答案”是,一般来说,在MySQL中,order by的表现要优于group by.虽然这取决于特定数据以及您认为“更好”的内容.

这个问题的具体问题是你有三个不同的查询返回三个不同的东西.

第一个返回所有员工的“密集等级”是相同的.该术语是故意使用的,因为它对应于MySQL不支持的ANSI dense_rank()函数.因此,如果您的工资是100,100和10,它将返回两行,排名为1,一行排名为2.

如果存在关联,则第二个返回不同的结果.如果工资是100,100,10,则此版本将不返回排名为1的行,排名为2的两行和排名为3的一行.

第三个结果返回一个完全不同的结果集,这只是薪水和工资的排名.

我的评论旨在尝试对您的数据进行查询.实际上,您应该从功能和性能角度来决定实际需要的内容.

转载注明原文:MYSQL查询查找具有第n个最高薪水的所有员工 - 代码日志