选择与最旧条目匹配的所有条目
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
最后是第一个查询中与key1
和key2
匹配的所有条目:
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;
【讨论】:
以上是关于选择与最旧条目匹配的所有条目的主要内容,如果未能解决你的问题,请参考以下文章