MySQL使用group by分组查询每组最新的一笔数据实现方式!
MySQL使用group by分组查询每组最新的一笔数据实现方式!
作者:yuhuofei2021
这篇文章主要介绍了MySQL使用group by分组查询每组最新的一笔数据实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教。
今天遇到一个查询数据库数据的问题:要获取每个分组最新的一笔数据,并将每个分组最新的一笔数据重新组成一个新的列表
这种场景,当然是想到了分组查询,使用 group by,思路也很清晰:
- 将所有记录根据时间 order by desc ,倒叙排列一遍
- 将第1步中的数据,group by 一下,就能得到想要的列表
按这个思路,得到的 sql 语句如下:
1
2
3
4
5
6
7
8
|
select * from ( select * from company_info where company_name = 'xxxxx科技有限公司' order by create_time desc ) t group by t.department; |
思路没有问题,语句也没有问题,但执行后,却怎么也得不到想要的结果
这里有一个大坑,那就是从 mysql 5.7 开始,对于子查询的排序,其实是不生效的,意思就是下面这个子查询语句的排序,对于整体而言无效,所以最终得不到想要的结果
1
2
3
4
|
select * from company_info where company_name = 'xxxxx科技有限公司' order by create_time desc |
解决方式
方式一
还是上面的思路,只要加上一个 limit 就可以拿到想要的结果了,语句如下:
1
2
3
4
5
6
7
8
9
|
select * from ( select * from company_info where company_name = 'xxxxx科技有限公司' order by create_time desc limit 1000 ) t group by t.department; |
这个就算是在 mysql 5.7 及更高的版本也能跑,亲测可用。
至于 limit 后面的数字是 1000 还是 10000,可以根据具体的业务场景设置
方式二
联表查询,实现的语句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
select * from ( select department, max (create_time) as date_time from company_info where company_name = 'xxxxx科技有限公司' group by department ) a left join company_info t on t.department = a.department and t.create_time = a.date_time; |
使用 max 函数获取最新的 create_time 和 department,并分组,然后作为一张表 a 和原来的表 t 进行联查
总结
以上为个人经验,希望能给大家一个参考。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需129元,即可下载本站文章涉及的文件和软件。