返回SQL中"MAX"值的所有行?

Rid*_*ils 14 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中),但只返回一行.

Joe*_*lli 36

SELECT Id, value
    FROM Scores
    WHERE value = (SELECT MAX(value) FROM Scores);
Run Code Online (Sandbox Code Playgroud)


Gor*_*off 6

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

select *
from t
where value = (select max(value) from t)
Run Code Online (Sandbox Code Playgroud)


Chr*_*hey 6

使用快速变量:

SELECT @max := max(value) from scores;
SELECT id, value FROM scores WHERE value = @max;
Run Code Online (Sandbox Code Playgroud)

或者:(我通常坚决反对子查询,但这个是不费脑子的.

SELECT id, value FROM
scores
INNER JOIN (Select max(value) as value from scores) as max USING(value)
Run Code Online (Sandbox Code Playgroud)

请注意,这些都是最好的更基本的'WHERE值=(子查询),因为他们每个人,执行寻找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(我无法解释这个,但我很想知道为什么:-)


Joc*_*lyn 3

使用此查询:

SELECT id, value
FROM Scores
WHERE value>=ALL(SELECT value FROM Scores)
Run Code Online (Sandbox Code Playgroud)

文档:带有 ALL 的子查询

优化子查询

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

value {ALL|ANY|SOME} {> | < | >= | <=} (uncorrelated subquery)
Run Code Online (Sandbox Code Playgroud)

例如,这个 WHERE 子句:

WHERE 5 > ALL (SELECT x FROM t)
Run Code Online (Sandbox Code Playgroud)

优化器可能会这样处理:

WHERE 5 > (SELECT MAX(x) FROM t)
Run Code Online (Sandbox Code Playgroud)