我有下表:
表:分数我拥有的:
+----+-------+ | 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)
在 MySQL 中,您需要使用连接或子查询来执行此操作:
select *
from t
where value = (select max(value) from t)
Run Code Online (Sandbox Code Playgroud)
使用快速变量:
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评估每一行的频率的信息.以下是您的样本数据的"得分"(越低越好):
使用此查询:
SELECT id, value
FROM Scores
WHERE value>=ALL(SELECT value FROM Scores)
Run Code Online (Sandbox Code Playgroud)
文档:带有 ALL 的子查询
MySQL 用涉及 MIN() 或 MAX() 的表达式增强了以下形式的表达式,除非涉及 NULL 值或空集:
Run Code Online (Sandbox Code Playgroud)value {ALL|ANY|SOME} {> | < | >= | <=} (uncorrelated subquery)
例如,这个 WHERE 子句:
Run Code Online (Sandbox Code Playgroud)WHERE 5 > ALL (SELECT x FROM t)
优化器可能会这样处理:
Run Code Online (Sandbox Code Playgroud)WHERE 5 > (SELECT MAX(x) FROM t)