2017-07-15 150 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