Mysql根据时间取出每组数据中最新的⼀条
mysql删除重复的数据保留一条下策——查询出结果后将时间排序后取第⼀条
select * from a
where create_time<="2017-03-29 19:30:36"
order by create_time desc
limit 1
这样做虽然可以取出当前时间最近的⼀条记录,但是⼀次查询需要将表遍历⼀遍,对于百万以上数据查询将⽐较费时;limit是先取出全部结果,然后取第⼀条,相当于查询中占⽤了不必要的时间和空间;还有如果需要批量取出最近⼀条记录,⽐⽅说:“⼀个订单表,有⽤户,订单时间,⾦额,需要⼀次性查询所有⽤户的最近的⼀条订单记录”,那么每个⽤户⼀次查询就要做⼀次整表的遍历,数据⼤的情况下,时间将会以指数形式增长,不能投⼊实际使⽤。
中策——查询排序后group by
select * from (
select * from a
where create_time<="2017-03-29 19:30:36"
order by create_time desc
) group by user_id
后来发现使⽤group by 可以根据group by 的参数列分组,但返回的结果只有⼀条,仔细观察发现group by是将分组后的第⼀条记录返回。时间在查询后默认是顺序排列,因此需要先将时间倒序排列,⽅可取出距离当前最近⼀条。
这样查询实际上还是进⾏了两次查询,虽然时间上相⽐第⼀个⽅法有了质的飞跃,但是还可以进⼀步优化。
上策——将max() ⽅法和group by结合使⽤
select *,max(create_time) from a
where create_time<="2017-03-29 19:30:36"
group by user_id
这句可以理解为将结果集根据user_id分组,每组取time最⼤⼀条记录。这样就很好的实现了批量查询最近记录,并且仅仅需要遍历⼀次表,即使在数据量巨⼤的情况下也可以在很短的时间查出结果。
扩展:
现在有⼀张资产设备表:base_assets_turn
查询资产的最新保管⼈
注:假设资产编号 ASSETS_ID=254
下策:
select * from base_assets_turn
where ASSETS_ID = 254
order by create_time desc
limit 1
中策:
select * from ( select * from base_assets_turn
where ASSETS_ID = 254
order by create_time desc) tt GROUP BY tt.ASSETS_ID;
上策:
那么上策该如何书写呢,欢迎留⾔!
以上所述是⼩编给⼤家带来的Mysql查询最近⼀条记录的sql语句(优化篇),希望对⼤家有所帮助,如果⼤家有任何疑问欢迎给我留⾔!
转载:www.jb51/article/140886.htm
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论