news 2026/7/5 21:28:29

mysql分组后,取每组第一条数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mysql分组后,取每组第一条数据

在mysql 5.7之前(不包括5.7)

select * from (select a.* from template_detail a where a.template_id in (3, 4) order by a.id desc) tt group by tt.template_id;

但是在mysql 5.7之后(包括5.7),这样查询会发现order by 失效

是因为mysql 5.7引入了derived_merge

什么是derived_merge?
derived_merge指的是一种查询优化技术,作用就是把派生表合并到外部的查询中,提高数据检索的效率。这个特性在MySQL5.7版本中被引入,可以通过如下SQL语句进行查看/开启/关闭等操作。

上面虽然听起来感觉很牛逼的样子,但是实际情况是,这个新特性,不怎么受欢迎,容易引起错误。

可以在子查询中使用以下函数来进行关闭这个特性:

可以通过在子查询中使用任何阻止合并的构造来禁用合并,尽管这些构造对实现的影响并不明确。 防止合并的构造对于派生表和视图引用是相同的:

  1. 聚合函数( SUM() , MIN() , MAX() , COUNT()等)
  2. DISTINCT
  3. GROUP BY
  4. HAVING
  5. LIMIT
  6. UNION或UNION ALL
  7. 选择列表中的子查询
  8. 分配给用户变量
  9. 仅引用文字值(在这种情况下,没有基础表)

所以mysql5.7比较常见的实现方法是:

select * from (select a.* from template_detail a where a.template_id in (3, 4) order by a.id desc limit 10000) tt group by tt.template_id;

这一种也是网上推荐最多的,但个人觉得局限性太大,不介意用在实战上

推荐写法:

select * from (select distinct(a.id) tid, a.* from template_detail a where a.template_id in (3, 4) order by a.id desc) tt group by tt.template_id;

加了distinct(a.id) tid, 后结果正确,原因是因为临时表(派生表derived table)中使用order by且使其生效,必须满足三个条件:

  1. 外部查询禁止分组或者聚合
  2. 外部查询未指定having,HAVING, order by
  3. 外部查询将派生表或者视图作为from句中唯一指定源

不满足这三个条件,order by会被忽略。

一旦外部表使用了group by,那么临时表(派生表 derived table)将不会执行filesort操作(即order by 会被忽略),所以我在临时表中加了(distinct(a.id))。
加了之后就相当于关闭了该特性,所以也就生效了。

或者这样效率更高一点:

SELECT bb.`detail`, bb.`id`,bb.`template_id` from `template_detail` bb INNER JOIN ( SELECT MAX(`id`) id, `template_id` from `template_detail` GROUP BY `template_id` ) as tb on bb.`id` = tb.id
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 21:25:12

Windows上配置完整Linux开发环境(二):Linux发行版Anaconda安装与使用

1、什么是环境 在软件开发和计算机科学领域,"环境"通常指的是一个包含软件和配置的容器,提供了一个特定的运行环境或工作环境。环境可以涉及多个层面,包括硬件环境、操作系统环境和软件环境。 1.1、硬件环境 包括计算机的物理硬…

作者头像 李华
网站建设 2026/7/5 21:23:22

Instatic视觉编辑器高级功能:宏与自动化操作完全指南

Instatic视觉编辑器高级功能:宏与自动化操作完全指南 【免费下载链接】Instatic Instatic is a modern self-hosted visual CMS - get it running in 1 minute 项目地址: https://gitcode.com/GitHub_Trending/in/Instatic Instatic作为一款现代化的自托管视…

作者头像 李华
网站建设 2026/7/5 21:21:44

如何在现代电脑上重温PS3经典游戏:RPCS3模拟器实战方案

如何在现代电脑上重温PS3经典游戏:RPCS3模拟器实战方案 【免费下载链接】rpcs3 PlayStation 3 emulator and debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 还在为老旧的PS3主机性能不足而烦恼吗?想要在现代电脑上以更高画质…

作者头像 李华
网站建设 2026/7/5 21:21:15

如何重构现有RAG系统:模块化多模态集成技术指南

如何重构现有RAG系统:模块化多模态集成技术指南 【免费下载链接】RAG-Anything "RAG-Anything: All-in-One RAG Framework" 项目地址: https://gitcode.com/GitHub_Trending/ra/RAG-Anything 在当今AI技术快速发展的时代,传统文本聚焦的…

作者头像 李华
网站建设 2026/7/5 21:19:34

鸿蒙原生 ArkTS 布局深度解析:bindContentCover 全屏覆盖层实战

鸿蒙原生 ArkTS 布局深度解析:bindContentCover 全屏覆盖层实战一、引言 在移动端开发中,「全屏覆盖层」是极其常见的交互模式。无论是展示详情页、弹出表单还是预览大图,开发者都需要一个能完整覆盖当前屏幕、独立于页面栈、可自定义过渡动画…

作者头像 李华
网站建设 2026/7/5 21:18:22

Plone内容管理系统安全机制深度解析:对象级权限与不可变模型

1. 项目概述:为什么说Plone是“最安全的CMS”不是营销话术,而是工程实践的结果Plone是的Most Secure CMS——这句话在内容管理系统(CMS)圈子里流传多年,常被当作一句带点调侃意味的行业梗。但如果你真去翻它的CVE历史记…

作者头像 李华