Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:获得列中第二大数值的最佳方法?没有查询限制_Mysql_Sql_Optimization - Fatal编程技术网

MySQL:获得列中第二大数值的最佳方法?没有查询限制

MySQL:获得列中第二大数值的最佳方法?没有查询限制,mysql,sql,optimization,Mysql,Sql,Optimization,问题: 给定一个带有列age(类型:INTEGER)的表people,编写一个查询以搜索并返回第二大年龄 我的解决方案: SELECT MAX(age) FROM people WHERE age <> (SELECT MAX(age) FROM people); 这是一个非常简单的问题,但我想知道哪一个更为优化,即最小化SQL负载的查询。我不熟悉SQL设置中的算法复杂性,但我猜第一个查询是在O(n^2)中运行的,因为MySQL需要找到长度分别为n-1和n的两个查询的最大值。这个分

问题:

给定一个带有列
age
(类型:INTEGER)的表
people
,编写一个查询以搜索并返回第二大年龄

我的解决方案:

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

这是一个非常简单的问题,但我想知道哪一个更为优化,即最小化SQL负载的查询。我不熟悉SQL设置中的算法复杂性,但我猜第一个查询是在
O(n^2)
中运行的,因为MySQL需要找到长度分别为
n-1
n
的两个查询的最大值。这个分析正确吗?如果是这样,我觉得我应该选择我的第二个解决方案。如果您有任何想法,我将不胜感激,谢谢

我认为
限制
/
偏移
是最简单的方法:

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);

在MySQL中,聚合可能非常昂贵。

在第一次查询中不需要分组方式(如所写)。如果您有
索引(年龄)
,则第一次查询是非常优化的;第二个从性能角度看是可怕的;第三个很一般。@RickJames<在第一次查询中需要代码>分组依据
。OP似乎想要第二个不同的值,而不是第二行中的值(可能与最大值相同)。好的,
groupby
。我确认第一个查询只涉及索引的几行;第三是速度快。
SELECT MAX(age)
FROM people
WHERE age <> (SELECT MAX(age) FROM people);
SELECT age
FROM people
WHERE age <> (SELECT MAX(age) FROM people)
ORDER BY age DESC
LIMIT 1;