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

标签 mysql sql greatest-n-per-group

两个表分别是salary_employee和employee

员工工资

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 中有不同的处理方式,有时某些方法比其他方法更好。排名问题只是众多例子中的一个。您问题的“答案”是,一般来说,order by 在 MySQL 中比 group by 执行得更好。尽管这甚至取决于特定数据以及您认为“更好”的内容。

问题的具体问题是您有三个不同的查询,它们返回三个不同的东西。

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

如果存在平局,则第二个返回不同的结果。如果薪水为 100、100、10,此版本将不返回排名为 1 的行、两行排名为 2 的行和一行排名为 3 的行。

第三个返回完全不同的结果集,它只是薪水和薪水排名。

我的评论是针对尝试对您的数据进行查询。事实上,您应该从功能和性能的角度来决定您真正想要什么。

关于MYSQL查询查找薪水第n高的所有员工,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25058177/

相关文章:

mysql - 如何优化我的 mysql 查询

javascript - 在 PHP 中获取 MySQL DateTime 到 JavaScript 中的秒

sql - 如何使用 DBMS_OBFUSCATION_TOOLKIT.MD5 将 VARCHAR2 散列为字母数字

mysql - 功能类似于 GROUP_CONCAT(支持排序)但只返回 1 个结果?或者喜欢 MAX 但有顺序?

sql - 选择相关表中前N个结果最高的项目

MySQL 合并来自相同方案表的 UNION 的结果

php - MYSQL 查询在使用 where、group by 和 order by 时花费太多时间

mysql - 从同一个表中选择与逗号分隔值字符串匹配的所有行

MySQL 按条件显示关系 MANY-MANY

sql - 然后使用前 10 个查询来搜索与其关联的所有记录