欢迎来到万象站长学堂!

Mysql

当前位置: 主页 > 数据库 > Mysql > 文章列表

MySQL使用group by分组查询每组最新的一笔数据实现方式

时间:2025-10-22 12:43:55|栏目:Mysql|点击:15 次

问题来源

今天遇到一个查询数据库数据的问题:要获取每个分组最新的一笔数据,并将每个分组最新的一笔数据重新组成一个新的列表

这种场景,当然是想到了分组查询,使用 group by,思路也很清晰:

  • 将所有记录根据时间 order by desc ,倒叙排列一遍
  • 将第1步中的数据,group by 一下,就能得到想要的列表

按这个思路,得到的 sql 语句如下:

select *
from (
select *
from company_info
where company_name = 'xxxxx科技有限公司'
order by create_time desc
) t
group by t.department;

思路没有问题,语句也没有问题,但执行后,却怎么也得不到想要的结果

这里有一个大坑,那就是从 mysql 5.7 开始,对于子查询的排序,其实是不生效的,意思就是下面这个子查询语句的排序,对于整体而言无效,所以最终得不到想要的结果

select *
from company_info
where company_name = 'xxxxx科技有限公司'
order by create_time desc

解决方式

方式一

还是上面的思路,只要加上一个 limit 就可以拿到想要的结果了,语句如下:

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,可以根据具体的业务场景设置

方式二

联表查询,实现的语句如下:

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 进行联查

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持万象站长学堂。

上一篇:MySQL中的锁机制详解之全局锁,表级锁,行级锁

栏    目:Mysql

下一篇:mysql表空间结构和日志的用途详解

本文标题:MySQL使用group by分组查询每组最新的一笔数据实现方式

本文地址:https://zhanzhang.eapis.site/html/739.html

您可能感兴趣的文章

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:120507403 | 邮箱:120507403@qq.com

Copyright © 2002-2025 万象站长学堂 版权所有沪ICP备2021023961号-8 粤公网安备 13010202004186