【问题标题】:Select all entries that match the oldest entry选择与最旧条目匹配的所有条目
【发布时间】:2017-12-20 16:50:43
【问题描述】:

在 MariaDB / MySQL 中,我有一个这样的表:

table (key1, key2, date)INDEX(key1, key2)

现在我想取最旧的条目:

SELECT * FROM `table` ORDER BY `date` ASC LIMIT 1

最后是第一个查询中与key1key2 匹配的所有条目:

SELECT * FROM `table` WHERE `key1` = ? AND `key2` = ?

能否以某种方式将其简化为一个查询?

【问题讨论】:

    标签: mysql sql mariadb groupwise-maximum


    【解决方案1】:

    自从 MariaDB 10.2 引入了通用表表达式,可以使用另一种方法来编写此查询。使用WITH 语法,查询看起来像这样:

    WITH t_oldest AS (SELECT * FROM `table` ORDER BY `date` asc LIMIT 1)
    SELECT t.* FROM `table` AS t,t_oldest 
    WHERE t.key1 = t_oldest.key1 AND t.key2 = t_oldest.key2;
    

    【讨论】:

    • 这看起来很有趣。你知道这个查询是否会比 Gordon Linoff 的 JOIN 解决方案有更好/更差的性能吗?
    • 不,我没有进行任何性能测试,但如果有任何这样的结果,我会很感兴趣。我会同意 Alex Pool 对 Stackoverflow 上一个问题的回答,该问题之前询问了两种不同方法之间的差异。 [stackoverflow.com/questions/30078464/…我个人认为 WITH 版本由于使用了名称而更具可读性(我在上面的示例中使用了 t_oldest)。更复杂的查询将在这方面受益更多。
    【解决方案2】:

    只需使用join:

    select t.*
    from `table` t join
         (select t.*
          from `table` t
          order by `date` asc
          limit 1
         ) tt
         on t.key1 = tt.key1 and t.key2 = tt.key2;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2023-03-11
      • 2018-10-17
      相关资源
      最近更新 更多