我有一个这样的数据库表:
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返回编号最高的版本。(因此,第二行和最后一行仅在上面)。
我尝试在按version_id DESC排序时尝试使用分组方式-但似乎在对其分组后进行了排序,因此这行不通。
任何人有任何想法吗?我简直不敢相信!
更新:
提出这个,它可以工作,但是使用子查询:
SELECT * FROM (SELECT * FROM table ORDER BY version_id DESC) t1 GROUP BY t1.id
这称为选择列的分组最大值。这是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中没有得到很好的优化,但是不相关的子查询并不是很糟糕,只要它们不是很大,它们将被写入磁盘而不是内存。假设此查询中只有两个int,则该子查询可能比该查询早几百万行,但是您的第一个查询中的select *子查询可能会更早地遇到此问题。