【发布时间】:2012-10-28 22:17:56
【问题描述】:
我有表 Races 与行 ID, Name 和 TotalCP 。我从Races SELECT MIN(TotalCP),但是我想选择具有最小值的整行。如何在单个查询中做到这一点?
【问题讨论】:
我有表 Races 与行 ID, Name 和 TotalCP 。我从Races SELECT MIN(TotalCP),但是我想选择具有最小值的整行。如何在单个查询中做到这一点?
【问题讨论】:
从聚合值中获取整行的一般形式是:
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 个查询,而不是单个查询,所以那里有一些开销吗?
TotalCP,然后再次检索加入。如果TotalCP 是唯一的并且优化器知道这一点并且专门针对这种情况编写它可能不必进行第二次查找。不过,无论哪种情况,担心这么小的事情感觉有点像过早的微优化恕我直言。还值得指出的是,如果TotalCP 不是唯一的,第一个查询将返回所有行,而后者只返回 1。
Select * from Races
where TotalCP = SELECT MIN( TotalCP ) FROM Races
【讨论】:
子查询是您的选择,
SELECT * FROM Races where TotalCP = (SELECT MIN( TotalCP ) FROM Races)
【讨论】: