返回SQL中“MAX”值的所有行?

时间:2012-08-28 21:31:15

标签: mysql max

我有下表:

表:分数 我有什么:

+----+-------+
| Id | value |
+----+-------+
|  1 |   300 |
|  2 |   300 |
|  3 |   300 |
|  4 |   100 |
|  5 |   200 |
+----+-------+

我需要什么:

+----+-------+
| Id | value |
+----+-------+
|  1 |   300 |
|  2 |   300 |
|  3 |   300 |
--------------

我如何在SQL中获取“全部”最高分数id 1,2,3。我开始使用MAX(在mysql中),但只返回一行。

4 个答案:

答案 0 :(得分:35)

SELECT Id, value
    FROM Scores
    WHERE value = (SELECT MAX(value) FROM Scores);

答案 1 :(得分:5)

使用快速变量:

SELECT @max := max(value) from scores;
SELECT id, value FROM scores WHERE value = @max;

或者:(我通常坚决反对子查询,但这个是明智的。

SELECT id, value FROM
scores
INNER JOIN (Select max(value) as value from scores) as max USING(value)

请注意,这些都比更基本的`WHERE value =(子查询)更好,因为对于它们中的每一个,查找MAX值的查询只执行一次(绝对保证这个这就是我更喜欢基于变量的解决方案的原因。使用子查询版本(在WHERE中,而不是JOIN),该查询可能每行执行一次

我已经使用EXPLAIN EXTENDED进行了一些查询分析,并且INNER JOIN方法可能是所有建议中最简洁和最优的(假设您处于使用MySQL变量过于繁琐的环境中;我仍然认为这是最干净的)。

性能:

自从进行了一些有趣的讨论之后,我决定真正深入研究并评估这些事情(我知道,过度杀戮,但在更大的问题上有趣而有用的知识)。检测全表扫描有一些分析技巧;将WHERE (@foo := @foo + 1)添加到相关子查询中,然后将@foo设置为0,运行查询,并查看@foo是什么。这不是最终所有查询收费标准,但它可以提供有关您询问MySQL评估每一行的频率的信息。以下是您的样本数据的“得分”(越低越好):

  • @ctrahey(both):5(扫描一次以找到MAX)
  • @Joe Stefanelli:25(扫描一次每行(5 * 5))
  • @Jocelyn:17(我无法解释这个,但我很想知道原因: - )

答案 2 :(得分:4)

在MySQL中,您需要使用连接或子查询来执行此操作:

select *
from t
where value = (select max(value) from t)

答案 3 :(得分:3)

使用此查询:

SELECT id, value
FROM Scores
WHERE value>=ALL(SELECT value FROM Scores)

文档:Subqueries with ALL

Optimizing Subqueries

  

MySQL使用表达式增强以下表单的表达式   涉及MIN()或MAX(),除非是NULL值或空集   涉及:

value {ALL|ANY|SOME} {> | < | >= | <=} (uncorrelated subquery)
     

例如,这个WHERE子句:

WHERE 5 > ALL (SELECT x FROM t)
     

可能会被优化器处理为:

WHERE 5 > (SELECT MAX(x) FROM t)