MySQL MIN/MAX 所有行
Posted
技术标签:
【中文标题】MySQL MIN/MAX 所有行【英文标题】:MySQL MIN/MAX all row 【发布时间】:2012-10-28 22:17:56 【问题描述】:我有表 Races
与行 ID
, Name
和 TotalCP
。我从Races
SELECT MIN(TotalCP
),但是我想选择具有最小值的整行。如何在单个查询中做到这一点?
【问题讨论】:
【参考方案1】:从聚合值中获取整行的一般形式是:
SELECT *
FROM Races
WHERE TotalCP = (SELECT MIN(TotalCP) FROM Races)
或
SELECT r.*
FROM
(
SELECT MIN(TotalCP) t
FROM Races
) m
INNER JOIN Races r ON m.t = r.TotalCP
但是,在这种情况下,由于您使用的是MIN
,因此您只需排序并取第一行:
SELECT *
FROM Races
ORDER BY TotalCP
LIMIT 1
【讨论】:
在子查询上使用ORDER BY col LIMIT 1
解决方案是否有任何性能优势/劣势?我的理解不建议,因为存储引擎必须在两种情况下都读取索引的末尾才能获取 MIN/MAX 值,然后再使用 const ref 检查实际表数据以获取其他列值......(假设没有覆盖索引存在)。但是话又说回来,第一个解决方案是 2 个查询,而不是单个查询,所以那里有一些开销吗?
@Jon 老实说,我不是 100% 确定,但我可以肯定地看到第一个查询可能必须两次命中索引 - 一次检索最小值 TotalCP
,然后再次检索加入。如果TotalCP
是唯一的并且优化器知道这一点并且专门针对这种情况编写它可能不必进行第二次查找。不过,无论哪种情况,担心这么小的事情感觉有点像过早的微优化恕我直言。还值得指出的是,如果TotalCP
不是唯一的,第一个查询将返回所有行,而后者只返回 1。【参考方案2】:
Select * from Races
where TotalCP = SELECT MIN( TotalCP ) FROM Races
【讨论】:
【参考方案3】:子查询是您的选择,
SELECT * FROM Races where TotalCP = (SELECT MIN( TotalCP ) FROM Races)
【讨论】:
以上是关于MySQL MIN/MAX 所有行的主要内容,如果未能解决你的问题,请参考以下文章
使用 where min/max laravel 获取所有行
26《MySQL 教程》聚合函数(聚合函数 MIN、MAX)