我有一张桌子;包含 2 个字段,姓名和薪水。我使用下面的脚本来找到第三个最高薪水。
SELECT DISTINCT sal
FROM downtodate1.emp e1
WHERE 3 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal<= e2.sal);
我想知道它是如何工作的以及为什么在这里使用 3?
select distinct sal
from downtodate1.emp AS e1
where 3 = (
select count(distinct sal)
from downtodate1.emp e2
where e1.sal <= e2.sal
);
考虑你有一个这样的表:
sal
---
3
3
2
1
1
0
有了这部分
select distinct sal
from downtodate1.emp AS e1
你会得到结果
sal
---
3
2
1
0
这产生了4种不同的薪水。
现在子查询
select count(distinct sal)
from downtodate1.emp e2
where e1.sal <= e2.sal
对主查询中的每一行执行。它计算小于或等于主查询中行的不同值的数量。所以这个结果实际上是(但没有显示):
sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
3 1
3 1
2 2
1 3
1 3
0 4
与主查询不同,您将获得以下结果:
sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
3 1
2 2
1 3
0 4
并且使用该WHERE
子句3 = (/*subquery*/)
,您只会得到
sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
1 3
这一排。所以结果是1
。
希望现在很清楚。
这里有一个更快的方法...
SELECT salary
FROM
(
SELECT salary
, @prev := @curr
, @curr := salary
, @rank := IF(@prev = @curr, @rank, @rank+1) rank
FROM employee
CROSS
JOIN
( SELECT @curr := null, @prev := null, @rank := 0) sel1
ORDER
BY salary DESC
) x
WHERE rank = 3;
用这个....
SELECT DISTINCT sal FROM downtodate1.emp e1
WHERE 2 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal> e2.sal);
WHERE 0 =第 1 高 Sal
WHERE 1 =第二高的萨尔
WHERE 2 =第三高的萨尔
WHERE 3 = 第四高 Sal
索引从零开始(0)
而不是这个...
SELECT DISTINCT sal FROM downtodate1.emp e1
WHERE 3 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal<= e2.sal);
相反,您可以使用它来查找第 N 个最高薪水
SELECT sal FROM emp
ORDER BY sal DESC
LIMIT N,1
N 是第 N 个数。
也许重新格式化查询会澄清:
select distinct sal
from downtodate1.emp AS e1
where 3 = (
select count(distinct sal)
from downtodate1.emp e2
where e1.sal <= e2.sal
);
将子查询的结果与 3 进行比较,作为所需行的前面行数。这(可能)是 O(N^2) 计算,但在这种情况下可能就足够了。
这 3 和你写的一样
where
(select count(distinct sal) from downtodate1.emp e2 where e1.sal <= e2.sal) = 3 ;
其中 a = 3
或其中 3 = 不同 sal 的计数
使用子查询检索员工最高工资记录的简单方法
select * from Employee where salary in (select max(salary) from Employee)