一尘不染

MySQL-控制分组返回的行

mysql

我有一个这样的数据库表:

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

阅读 302

收藏
2020-05-17

共1个答案

一尘不染

这称为选择列的分组最大值。这是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
*子查询可能会更早地遇到此问题。

2020-05-17