2017-07-15 4 views
1

に一致するすべてのエントリを選択します。今、私は最も古いエントリ撮りたいINDEX(key1, key2)私はこのようなテーブル持ってMariaDB/MySQLで最も古いエントリ

table (key1, key2, date)を:

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

をと最後に、最初のクエリのkey1key2に一致するすべてのエントリ:

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

これを何らかの形で1つのクエリに単純化できますか?

答えて

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

いいえ、私はパフォーマンステストをしませんでしたが、そのような結果が得られれば興味があります。 2つの異なるアプローチの違いについて先に質問したStackoverflowの質問に対するAlex Poolの答えに沿って説明します。 [https://stackoverflow.com/questions/30078464/difference-between-with-clause-and-subquery] 私は個人的に名前の使用のために読みやすいバージョンを見つける(私は上記の例ではt_oldestを使用した) )。より複雑なクエリは、その側面でさらに役立ちます。 – smile2day

関連する問題