MySQL中无子查询获取最高二等工资的方法
SELECT sal FROM jos_salary ORDER BY sal DESC LIMIT 1,1;
最佳答案
对于这个PROFLAM的解决方案,很容易通过使用基于分组的最大方法,通过基于每个行的更高的编号将表连接到自身。使用此方法,您可以检索任何您喜欢的最高位置,这取决于联接数或计算单个联接中的行数。取决于你最喜欢哪种方法(我认为第二种方法更优雅)。
以下是使用groupwise方法解决问题的方法:
SELECT s1.sal
FROM job_salary s1
LEFT JOIN job_salary s2 ON s1.sal < s2.sal
LEFT JOIN job_salary s3 ON s2.sal < s3.sal
GROUP BY s1.sal
HAVING MAX(s3.sal) IS NULL AND MAX(s2.sal) IS NOT NULL
或计算联接匹配的数目:
SELECT s1.sal
FROM job_salary s1
LEFT JOIN job_salary s2 ON s1.sal < s2.sal
GROUP BY s1.sal
HAVING COUNT(DISTINCT s2.sal) = 1
顺便说一下,如果你这样做了:
SELECT s1.sal, COUNT(DISTINCT s2.sal) AS sals_higher
FROM job_salary s1
LEFT JOIN job_salary s2 ON s1.sal < s2.sal
GROUP BY s1.sal
ORDER BY s1.sal DESC
您可以看到,从最高工资到最低工资的结果,以及一个序列号,指示
s2
中每一行的连接行数。当您在条件s1
下将一个表连接到自身时,对于每一行,它将从s1.sal < s2.sal
连接到比s2
中当前薪资高的薪资数。例如,在最高的薪水上,没有比这个更高的薪水,因为它是最高的,这就是为什么你得到
s1
,而在第二高的薪水上,我们只有一个更高的薪水,这是最高的,这就是为什么我们得到0
等等。结果如下:
+------+-------------+
| sal | sals_higher |
+------+-------------+
| 7100 | 0 |
| 7000 | 1 |
| 6900 | 2 |
| 5400 | 3 |
| 5000 | 4 |
| 4700 | 5 |
+------+-------------+
现在,您所要做的就是在
1
子句中提供一个合适的条件,在您的情况下,这个条件等于HAVING
。祝你面试顺利!:-)
关于mysql - 如何在不使用子查询,限制和最高条款的情况下在mysql中找到第二高的薪水,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39406994/