当前位置:  开发笔记 > 后端 > 正文

MySQL - 控制一个组返回哪一行

如何解决《MySQL-控制一个组返回哪一行》经验,为你挑选了1个好方法。

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

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*子查询可能会更快地遇到此问题.



1> ʞɔıu..:

它被称为选择列的组最大值.以下是几种不同的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*子查询可能会更快地遇到此问题.


链接的文章非常好!
@ʞɔıu,是否可以使用`having`来控制`group by`返回的行?
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有