我有一个这样的数据库表:
id version_id field1 field2 1 1 texta text1 1 2 textb text2 2 1 textc text3 2 2 textd text4 2 3 texte text5
如果你没有解决它,它包含一行的多个版本,然后是一些文本数据.
我想查询它并返回每个id的编号最大的版本.(所以仅在上面的第二行和最后一行).
我尝试使用group by by version_id DESC进行排序 - 但它似乎在分组后进行排序,所以这不起作用.
有人有任何想法吗?我不敢相信它无法完成!
更新:
想出来,这有用,但使用子查询:
SELECT * FROM (SELECT * FROM table ORDER BY version_id DESC) t1 GROUP BY t1.id
ʞɔıu.. 49
它被称为选择列的组最大值.以下是几种不同的mysql方法.
我是这样做的:
SELECT * FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1 INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id
这将是相对有效的,虽然mysql将在内存中为子查询创建一个临时表.我假设你已经有了这个表的(id,version_id)索引.
这是SQL的一个缺陷,你或多或少必须使用子查询来解决这类问题(半连接是另一个例子).
子查询在mysql中没有很好地优化,但是不相关的子查询并不是那么糟糕,只要它们不是那么庞大以至于它们将被写入磁盘而不是内存.鉴于在此查询中只有两个整数,子查询在发生之前可能长达数百万行,但第一个查询中的select*子查询可能会更快地遇到此问题.
它被称为选择列的组最大值.以下是几种不同的mysql方法.
我是这样做的:
SELECT * FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1 INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id
这将是相对有效的,虽然mysql将在内存中为子查询创建一个临时表.我假设你已经有了这个表的(id,version_id)索引.
这是SQL的一个缺陷,你或多或少必须使用子查询来解决这类问题(半连接是另一个例子).
子查询在mysql中没有很好地优化,但是不相关的子查询并不是那么糟糕,只要它们不是那么庞大以至于它们将被写入磁盘而不是内存.鉴于在此查询中只有两个整数,子查询在发生之前可能长达数百万行,但第一个查询中的select*子查询可能会更快地遇到此问题.