ソフトウェア パッケージの更新に関するメタデータのテーブルがあります。表には列がありますid, name, version
。名前が特定の名前のリストの1つであり、バージョンがその名前のすべての行の最大であるすべての行を選択したい。
たとえば、次のレコードがあるとします。
+----+------+---------+
| id | name | version |
+----+------+---------+
| 1 | foo | 1 |
| 2 | foo | 2 |
| 3 | bar | 4 |
| 4 | bar | 5 |
+----+------+---------+
そして、タスク「レコード「foo」と「bar」の最新バージョンを教えてください。結果は次のようになります。
+----+------+---------+
| id | name | version |
+----+------+---------+
| 2 | foo | 2 |
| 4 | bar | 5 |
+----+------+---------+
私がこれまでに思いついたのは、ネストされたクエリを使用することです:
SELECT *
FROM updates
WHERE (
id IN (SELECT id
FROM updates
WHERE name = 'foo'
ORDER BY version DESC
LIMIT 1)
) OR (
id IN (SELECT id
FROM updates
WHERE name = 'bar'
ORDER BY version DESC
LIMIT 1)
);
これは機能しますが、気分が悪いです。より多くの名前でフィルタリングしたい場合は、サブクエリ全体を複数回複製する必要があります。これを行うより良い方法はありますか?