テーブルがあります。名前と給与の 2 つのフィールドが含まれています。以下のスクリプトを使用して、3 番目の最高給与を見つけました。
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;
この3つはあなたが書いたものと同じです
where
(select count(distinct sal) from downtodate1.emp e2 where e1.sal <= e2.sal) = 3 ;
ここで、a = 3
またはここで、3=個別の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)計算ですが、この場合はそれで十分かもしれません。