mysql分组统计每组最新数据

应用场景:

有一张表,记录了每个人发送消息的时间和内容,大致格式如下:

id user_id msg add_time
1 111 hello 2024-01-01 12:00:00
2 222 world 2024-01-01 14:00:00
3 333 ganha 2024-01-04 16:00:00
4 111 aniour 2024-01-11 14:00:00
5 333 kongmawa 2024-01-21 14:00:00

 

 现在需要统计每个人最新的访问内容和时间。有下面3个思路:

1、group by + order by 

order by 按照时间倒序排列:select * from test order by add_time desc;

group by 将它们按用户分组,每组自动获取第一个数据展示。

select * from (select * from test order by add_time desc) a group by user_id;

注意:

在mysql5.7中,系统会把子查询里的order by优化掉,导致不生效。解决方案:加上limt。限制条数尽可能设置得大一些。

 select * from (select * from test order by add_time desc limit 1000) a group by user_id;

 

2、group by + max + left join

通过group by和max()获取每个用过户对应的最新时间:select user_id, max(add_time) from test group by user_id;

将获取到的user_id和max(add_time)作为筛选条件left join到原表:

select a.* from 

(select user_id, max(add_time) as add_time from test group by user_id) b

left join test a 

on b.user_id = a.user_id

and b.add_time = a.add_time;

 

3、自增id + user_id + max + in

适用场景范围:id为自增字段且唯一,那么最新的add_time的数据对应id值最大。

通过group by和max()获取每个用户对应的id最大值:select max(id) from test group by user_id;

通过in查询这些max_ids的记录:

select * from test where id in 

(select max(id) from test group by user_id);

 

posted @   DoubleFishes  阅读(1033)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
  1. 1 今时意所属 你要不要买菜
  2. 2 夏夜最后的烟火 颜人中
  3. 3 夜泊秦淮 Ice Paper
  4. 4 脸红接收处 Plggy
  5. 5 那些花儿 朴树
夏夜最后的烟火 - 颜人中
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Not available

点击右上角即可分享
微信分享提示