MySQL-控制由组返回的行

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

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

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的最高编号的版本(因此第二行和最后一行仅在上面)。

我试着用组,同时按版本订购_IDDESC--但它似乎是在分组后排序,所以这不起作用。

有人有什么想法吗?我真不敢相信这事做不到!

最新情况:

提出了这个方法,它可以工作,但是使用一个子查询:

SELECT *
FROM (SELECT * FROM table ORDER BY version_id DESC) t1
GROUP BY t1.id
提问于
用户回答回答于

它被称为选择列的分组最大值。

我会这样做:

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,版本)_这张表的ID)。

对于这种类型的问题,或多或少需要使用子查询,这是SQL的一个缺陷(半连接是另一个例子)。

在MySQL中,SubQuery没有得到很好的优化,但是不相关的子查询并没有那么糟糕,只要它们不是很大,它们就会被写入磁盘而不是内存。由于在此查询中只有两个int,子查询可能在发生之前很久是数百万行,但是选择*第一个查询中的子查询可能会更快地受到此问题的影响。

用户回答回答于

我认为这会做到这一点,但不确定它是最好的还是最快的。

SELECT * FROM table 
WHERE (id, version_id) IN 
  (SELECT id, MAX(version_id) FROM table GROUP BY id)

扫码关注云+社区