我有一个用于更新软件包的元数据表。该表有列id, name, version
。我想选择名称是某个给定名称列表之一的所有行,并且版本是具有该名称的所有行的最大值。选择满足某些条件并在特定列中具有最大值的行
例如,考虑到这些记录:
+----+------+---------+
| id | name | version |
+----+------+---------+
| 1 | foo | 1 |
| 2 | foo | 2 |
| 3 | bar | 4 |
| 4 | bar | 5 |
+----+------+---------+
和任务“给我的记录,最高版本的‘富’与‘酒吧’,我希望得到的结果是:
+----+------+---------+
| 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)
);
这工作,但感觉错了。如果我要过滤。更多的名字,我必须多次复制整个子查询。有一个更好的方法吗?
我去到回答的情况下(如已澄清):http://stackoverflow.com/questions/3800551/sql-select-first-row-in-each-group-by-group/7630564#7630564 – 2013-04-20 12:50:47