在mysql 5.7之前(不包括5.7)

select * from (select a.* from template_detail awhere 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 awhere 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 awhere 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

mysql分组后,取每组第一条数据相关推荐

  1. oracle 取分组第一行,oracle分组后取每组第一条数据

    oracle 分组后取每组第一条数据 '数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER ...

  2. PG数据库:分组后取每组第一条数据

    PG数据库查询遇到一个需求,数据库表data,先对其中设备标识字段a分组group by,然后查一段时间内的每一个设备数据字段b的极大值和极大值发生的数据时间time,想起之前Oracle有类似写法, ...

  3. oracle 分组后取每组第一条数据

    数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, test1 ...

  4. Oracle分组后取每组第一条

    数据格式: 分组取第一条的效果: SQL: SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY X ORDER BY Y DESC) RN, T ...

  5. Mysql分组排序取每组第一条(二种实现方式)

    文章目录 前言 前期准备 第一种 原因分析: 解决: 第二种 GROUP_CONCAT函数解释: 前言 记录一下最近的一个需求,查不同产品排名第一的图片作为主图 其实一开始想用的是mybatis的级联 ...

  6. mysql分组排序取每组第一条

    记录一下今天遇到的一个需求: 表 (5-8秒刷新一次) 取更新时间.采集点编号和最新读数 说明一下 表里面有很多点位数据 然后固定时间insert一次 我需要拿到 最新时间的 所有点位的 数据 cre ...

  7. sql 分组并查询每组第一条数据

    Oracle数据库 select t.* from (select a.*, ROW_NUMBER() OVER (PARTITION BY 分组列 ORDER BY 组内排序列 DESC) rn f ...

  8. mysql 分组后取每个组内最新的一条数据

    首先,将按条件查询并排序的结果查询出来. 1 mysql> select accepttime,user,job from tuser_job where user =8 order by ac ...

  9. 分组后取每组最新的数据

    select * from members m where m.id in (select SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY age desc),',' ...

最新文章

  1. Android 核心分析 之六 -----IPC框架分析 Binder,Service,Se...
  2. 深入浅出K-Means算法
  3. nil slice 和 空 slice
  4. NLP-基础知识-005(专家系统)
  5. STM32’s I2C 硬件BUG引发的血案
  6. 9.找出1000以内的完数,所谓完数是指该数的各因子之和等于该数,如:6 = 1+2+3。
  7. ES5-11原型与原型链深入、对象继承
  8. 漫画:混乱的标记语言XHTML2/HTML5
  9. idea 热部署时 tomcat处 没有update classes and resource 选项
  10. poj2373 Dividing the Path (单调队列+dp)
  11. HTTP传递数据的几种方法
  12. 先学python还是r-r语言和python学哪个?
  13. Python-并发、并行、协成的简易理解
  14. Tracking相关的文章
  15. html中哪些字体不识别中文字体,div字体_正确设置div兼容的汉字中文字体
  16. 【机器学习】EM 算法
  17. 纬地道路纵断面设计教程_市政工程这样设计!案例视频教程+CAD图纸收好,市政全覆盖...
  18. java获取机器的IP
  19. 1 简历该怎么写?注意事项--绝密,程序员大厂面试求职大揭秘!
  20. picoctf-Scavenger Hunt wp

热门文章

  1. 2022最新超简洁小米步数网页源码
  2. XP系统加入域提示无法找到网络路径处理方法
  3. socket网络编程常用的结构及函数小结
  4. Vue.js前端开发实战总结(1)
  5. WebMeeting
  6. java微信支付v3系列——4.创建订单的封装及使用
  7. 如何在完全不懂服务器开发的情况下做一个实时联网对战的微信小游戏
  8. 【详细】三种主流跨平台技术探讨
  9. galera-mariadb集群
  10. php 转换成string,在PHP中将数字(1,2,3)转换为string(一,二,三)