2017-07-15 69 views
1

在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` = ? 

这可以简化为一个查询吗?

回答

3

只需使用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; 
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; 
+0

这看起来很有趣。你知道这个查询是否会比Gordon Linoff的JOIN解决方案有更好/更差的性能? – user2015253

+0

不,我没有进行任何性能测试,但如果有任何此类结果可用,我会感兴趣。 我会与亚历克斯池的回答Stackoverflow上的问题,以前问两种不同的方法之间的差异。 [https://stackoverflow.com/questions/30078464/difference-between-with-clause-and-subquery] 我个人发现WITH版本更具可读性,因为使用了一个名字(我在上面的例子中使用了t_oldest )。在这方面更复杂的查询将会受益匪浅。 – smile2day