【问题标题】:MySQL MIN/MAX all rowMySQL MIN/MAX 所有行
【发布时间】:2012-10-28 22:17:56
【问题描述】:

我有表 Races 与行 ID, NameTotalCP 。我从Races SELECT MIN(TotalCP),但是我想选择具有最小值的整行。如何在单个查询中做到这一点?

【问题讨论】:

    标签: mysql select max min


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2019-03-04
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        相关资源
        最近更新 更多