使用快速变量:
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 = ( subquery ) 更可取,因为对于它们中的每一个,查找 MAX 值的查询只执行一次(这绝对保证是我更喜欢基于变量的解决方案的原因) . 使用子查询版本(在 WHERE 中,而不是在 JOIN 中),该查询可能每行执行一次。
我用 做了一些查询分析EXPLAIN EXTENDED
,INNER JOIN 方法可能是所有建议中最简洁和最优的(假设你在使用 MySQL 变量的环境太麻烦;我仍然认为它是最干净的)。
表现:
由于发生了一些有趣的讨论,我决定真正深入研究并评估这些事情(我知道有点矫枉过正,但在更大的问题上有趣且有用的知识)。检测全表扫描有一些分析技巧;添加WHERE (@foo := @foo + 1)
到有问题的子查询中,然后将 @foo 设置为 0,运行查询并查看 @foo 是什么。这不是最终的全部查询收费指标,但它可以提供有关您要求 MySQL 评估每一行的频率的信息。以下是您的样本数据的“分数”(越低越好):
- @ctrahey(两者):5(扫描一次以找到 MAX)
- @Joe Stefanelli:25(每行扫描一次(5 * 5))
- @Jocelyn:17(我无法解释这个,但我很想知道为什么:-)