我有下表:
表:分数 我有什么:
+----+-------+ | 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中),但只返回一行。
答案 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评估每一行的频率的信息。以下是您的样本数据的“得分”(越低越好):
答案 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)
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)