暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mysql子查询实现分组取最指定数据的版本差异

数据库精要 2021-09-27
215

     mysql通过group by 分组子查询时,会自动保留最先搜索出来的数据。通过这个特性可以实现想要的结果,比如查询每科目考试第一名的同学成绩、查询每班最后一名到校的学生或者或者每班最先到校的学生。所有这些需求和要求可以放到子查询的order by子句下。通过order by 子句实现最先搜索出来的数据。

  1. select * from 

  2. (

          select * from table_name order by op_time desc

  1. ) as t

  2. group by t.user_id;

 在mysql5.5版本下执行该语句,ok,完美实现分组查询最新一条记录。

但是放到mysql5.7下,执行……呃呃呃,什么情况?怎么不是想要的结果?

难道是执行姿势不对?

正威禁坐,执行......不对。

难道说发型不对?换个发型,执行……还是不对!

不够虔诚?沐浴更衣,执行……不对!

到底是什么原因?

找啊找,试啊试,终于发现彩蛋了:

  1. select * from 

  2. (

          select * from table_name order by op_time desc 

         limit 1000

  1. as t

  2. group by t.user_id;

  3. 原来mysql5.7版本需要在子查询中加通关密语:limit,否则暗号不对,概不执行。

  4. 分析原因:5.7版本加limit 限制也是怕数据量太大,影响执行速度吧,为了取到自己想要的全部数据,limit后面的记录数自己可以灵活设置,基本不影响对该特性的使用。

  5. 优化是优化了,相信也给不少老司机挖了大大的坑。

  6. 下面做个小调查,你跳过这个坑吗?

  7. 相信看过这篇文章后,肯定会一跃而出的,再大的坑也挡不住你前进的步伐哦!


文章转载自数据库精要,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论