2016-07-11 144 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似乎想要第二个不同的值,而不是第二行中的值(可能与最大值相同)。 –