2016-07-11 145 views
1

問題:MySQL:獲得列中第二大數值最大值的最佳方法?沒有查詢限制

給定一個表people與列age(類型:整數),編寫一個查詢來搜索和返回的第二大時代。

我的解決辦法:

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

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

非常簡單的問題,但我不知道哪一個是更理想的,即,最大限度地減少SQL負載查詢。我不熟悉SQL設置中的算法複雜性,但我的猜測是第一個查詢在O(n^2)中運行,因爲MySQL需要分別查找長度分別爲n-1n的兩個查詢的最大值。這個分析是否正確?如果是這樣,我認爲我應該去找我的第二個解決方案。將不勝感激任何想法,謝謝!

回答

1

我覺得limit/offset是最簡單的方法:

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

然而,你的第一個版本:

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

可能是從性能的角度最佳,如果你有people(age)的索引。

等待:我想表達這種爲:

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

聚合可以在MySQL相當昂貴。

+0

在第一個查詢中不需要GROUP BY(如所寫)。 –

+0

如果你有'INDEX(age)',第一個查詢是非常優化的;從性能的角度來看,第二個是糟糕的;第三個是馬馬虎虎。 –

+0

@RickJames。 。 。在第一個查詢中需要「GROUP BY」。 OP似乎想要第二個不同的值,而不是第二行中的值(可能與最大值相同)。 –