两个表分别是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/