开发者社区> 问答> 正文

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

展开
收起
保持可爱mmm 2020-05-17 11:48:09 426 0
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 *子查询可能会更早地遇到此问题。来源:stack overflow

    2020-05-17 11:54:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像