我有一个用于更新软件包的元数据表。该表有列id, name, version
。我想选择名称是某个给定名称列表之一的所有行,并且版本是具有该名称的所有行的最大值。
例如,给定这些记录:
+----+------+---------+
| 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)
);
这有效,但感觉不对。如果我想过滤更多名称,我必须多次复制整个子查询。有一个更好的方法吗?