SELECT DISTINCT sal
FROM downtodate1.emp e1
WHERE 3 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal<= e2.sal);
我想知道它是如何工作的以及为什么使用3?
答案 0 :(得分:2)
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
。
希望现在很清楚。
答案 1 :(得分: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;
答案 2 :(得分:1)
使用这个....
选择不同的萨尔
FROM downtodate1.emp e1
WHERE 2 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal> e2.sal);
WHERE 0 = 1st High Sal
WHERE 1 = 第二高萨尔
WHERE 2 = 第三高萨尔
WHERE 3 = 4th High Sal
索引从零(0)开始
而不是这个...
选择不同的萨尔
FROM downtodate1.emp e1
WHERE 3 = (SELECT COUNT(DISTINCT sal) FROM downtodate1.emp e2 WHERE e1.sal<= e2.sal);
答案 3 :(得分:0)
相反,您可以使用它来查找第N个最高工资
SELECT sal FROM emp
ORDER BY sal DESC
LIMIT N,1
N是第N个数字。
答案 4 :(得分:0)
也许重新格式化查询将澄清:
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)计算,但在这种情况下可能就足够了。
答案 5 :(得分:0)
这3与你写的相同
where
(select count(distinct sal) from downtodate1.emp e2 where e1.sal <= e2.sal) = 3 ;
其中a = 3
或其中3 =不同sal的计数
答案 6 :(得分:0)
使用subQueries
检索Employee的最大工资记录的简单方法 select * from Employee where salary in (select max(salary) from Employee)