最近项目中遇到须要查询记录当前时间最近的一条记录的问题,开始感受无从下手,后来逐步发现了三种解决方案。html
select * from a where time<="2017-03-29 19:30:36" order by time desc limit 1
这样作虽然能够取出当前时间最近的一条记录,可是一次查询须要将表遍历一遍,对于百万以上数据查询将比较费时;limit是先取出所有结果,而后取第一条,至关于查询中占用了没必要要的时间和空间;还有若是须要批量取出最近一条记录,比方说:“一个订单表,有用户,订单时间,金额,须要一次性查询全部用户的最近的一条订单记录”,那么每一个用户一次查询就要作一次整表的遍历,数据大的状况下,时间将会以指数形式增加,不能投入实际使用。mysql
select * from ( select * from a where time<="2017-03-29 19:30:36" order by time desc ) group by user_id
后来发现使用group by 能够根据group by 的参数列分组,但返回的结果只有一条,仔细观察发现group by是将分组后的第一条记录返回。时间在查询后默认是顺序排列,所以须要先将时间倒序排列,方可取出距离当前最近一条。sql
这样查询实际上仍是进行了两次查询,虽然时间上相比第一个方法有了质的飞跃,可是还能够进一步优化。优化
select *,max(time) from a where time<="2017-03-29 19:30:36" group by user_id
这句能够理解为将结果集根据user_id分组,每组取time最大一条记录。这样就很好的实现了批量查询最近记录,而且仅仅须要遍历一次表,即便在数据量巨大的状况下也能够在很短的时间查出结果。spa
from:https://www.cnblogs.com/wwyz/p/6641895.htmlcode