複数列の主キー (都市/州/日付) とさらに多くのデータ列を持つテーブルがあります。各都市/州の最新データを取得しようとしています。それをきれいに/効率的に行うにはどうすればよいですか? 今すぐこれを行うには、フェッチしようとしているすべての行のリストを取得する最初のクエリを実行し、続いて大規模な WHERE 句を含む 2 番目のクエリを実行します。
SELECT state, city, max(date) from data GROUP BY city, state;
+-------+---------------------+------------+
| state | city | MAX(date) |
+-------+---------------------+------------+
| CA | San Francisco | 2013-09-01 |
| CA | Los Angeles | 2013-08-01 |
| NY | New York | 2013-10-01 |
| ... | ... (many rows) ... | ... |
+-------+---------------------+------------+
SELECT * FROM data WHERE
(state = "CA" AND city = "San Francisco" AND date='2013-09-01') OR
(state = "CA" AND city = "Los Angeles" AND date='2013-08-01') OR
(state = "NY" AND city = "New York" AND date='2013-10-01') OR
...
これは非常に見苦しく非効率的です。最初のクエリが多くの行を返す場合、2 番目のクエリが長すぎる可能性があります。明らかに、単一列の主キーがある場合は、IN() で副選択を使用できますが、ここでは実際には不可能です。助言がありますか?
更新:サブセレクトでビルの提案を試しましたが、キーを使用しておらず、永遠にかかっています。副選択を 5 行のみ返すように制限すると、0.64 秒で返されます。73 の都市と州の組み合わせをすべて返すようにすると、非常に長い時間がかかります (クエリはまだ実行中です)。
EXPLAIN SELECT * FROM data WHERE (city, state, date) IN (SELECT state, city, MAX(date) FROM data GROUP BY city, state)
+----+--------------------+-------+-------+---------------+---------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+-------+---------------+---------+---------+------+-------+-------------+
| 1 | PRIMARY | data | ALL | NULL | NULL | NULL | NULL | 13342 | Using where |
| 2 | DEPENDENT SUBQUERY | data | index | NULL | PRIMARY | 57 | NULL | 8058 | Using index |
+----+--------------------+-------+-------+---------------+---------+---------+------+-------+-------------+