选择与最旧条目匹配的所有条目

Posted

技术标签:

【中文标题】选择与最旧条目匹配的所有条目【英文标题】: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` = ?

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

【问题讨论】:

【参考方案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 对 *** 上一个问题的回答,该问题之前询问了两种不同方法之间的差异。 [***.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;

【讨论】:

以上是关于选择与最旧条目匹配的所有条目的主要内容,如果未能解决你的问题,请参考以下文章

在单个查询中选择两个特定的 mysql 表行

Hazelcast - 最旧的条目首先被驱逐

Django在数据库中找到最旧的条目

当存在 NULL 时,性能选择与另一个表中的条目不匹配的行

选择最接近的值小于给定值的条目

MySQL 从具有重复引用条目的联合表中选择唯一记录