2016-07-11 3 views
1

問題:ageとテーブルpeople考えるMySQL:列の数値的に2番目に大きな値を取得する最も最適な方法は?ノークエリの制限

(タイプ:INTEGER)、検索して第二位の年齢を返すようにクエリを記述。

私のソリューション:

SELECT MAX(age) FROM people 
WHERE age <> (SELECT MAX(age) FROM people); 

SELECT age FROM people 
ORDER BY age DESC LIMIT 1,1; 

非常に簡単な問題が、私は、すなわちSQLの負荷を最小限に抑え、クエリより最適である1思っていました。私はSQL設定のアルゴリズムの複雑さに精通していませんが、最初のクエリはO(n^2)で実行されます。これは、それぞれn-1nの長さの2つのクエリの最大値を見つける必要があるためです。この分析は正しいですか?もしそうなら、私は私の2番目の解決策に行くべきだと私には思われます。考えていただければ幸いです。私はlimit/offset考える

答えて

1

は最も簡単な方法です:

select age 
from people 
group by age 
order by age desc 
limit 1, 1; 

はしかし、あなたの最初のバージョン:あなたはpeople(age)のインデックスを持っている場合

SELECT MAX(age) 
FROM people 
WHERE age <> (SELECT MAX(age) FROM people); 

はおそらく、パフォーマンスの観点から最適です。

待ち:集計は、MySQLにかなり高価になることができ

SELECT age 
FROM people 
WHERE age <> (SELECT MAX(age) FROM people) 
ORDER BY age DESC 
LIMIT 1; 

:として私はこれを表現でしょう。

+0

「GROUP BY」は最初のクエリで(書かれているように)_not_する必要はありません。 –

+0

'INDEX(age)'がある場合、最初のクエリは非常に最適です。 2番目はパフォーマンスの観点からひどいものです。 3番目はそうそうです。 –

+0

@RickJames。 。 。最初のクエリでは 'GROUP BY 'が必要です。 OPは、第2行の値ではなく、第2の別個の値を必要とするように思われる(これは最大値と同じでもよい)。 –

関連する問題