开发者

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

目录
  • 问题来源
  • 解决方式
    • 方式一
    • 方式二
  • 总结

    问题来源

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

    这种场景,当然是想到了分组查询,使用 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
    wphphere company_name = 'xxxxx科技有限公司'
    orderpython by create_time desc
    limit 1000
    ) t
    group by t.department;
    

    这个就算是在 mysql 5.7 php及更高的版本也能跑,亲测可用。

    至于 limit 后面的数字是 1000 还是 10000,可以根据具体的业务场景设置

    方式二

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

    select
    JKGEbbp	*
    from
    	(
    	select
    		department,
    		max(create_time) as date_time
    	from
    		company_info
    	where
    		company_name = 'xxxxx科技有限公司'
    	group by
    		department
    ) a
    left join company_in编程fo t 
    on
    	t.department = a.department
    	and t.create_time = a.date_time;
    

    使用 max 函数获取最新的 create_time 和 department,并分组,然后作为一张表 a 和原来的表 t 进行联查

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:没有了

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新数据库

    数据库排行榜