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最大一条记录。这样就很好的实现了批量查询最近记录,并且仅仅需要遍历一次表,即使在数据量巨大的情况下也可以在很短的时间查出结果

如果是主键子自增, 则可以直接求主键的最大值

这边虽然带出了正确的 时间 ,但是没有带出这条正确 时间 的result,因此我们需要获取到这条 时间 对应的result。在之前的 sql ,我只把 最近 一条 时间 出来了,却没有把那条 时间 对应的结果带出来。 先说单表的 询以B表为例: sql 语句: select *from (select b.* from car_examinelog as b ORDER BY b.e_time desc) as c GROUP BY c.car_id 这里的 sql 意思是先按日期排序 在按照car_id分组 这样 出每个car_id 最新 的... 从 SQL Server 2005开始,增加了一个新的函数Row_Number(),他的一个很伟大的作用就是可以在 数据 添加一列从1开始的行号,这样大大代替所有多余的代码来产生行号。下面就教大家如何使用Row_Number()函数。     假设 数据库 有如下表: 代码如下: id    name 1    aa 3    bb 4    cc     执行如下 SQL 语句后将得到如下结果: SELECT ROW_NUMBER() OVER(ORDER BY id) as rowNum,* FROM 表名称 代码如下: rowNum    id    name select * from om_meeting_schedule s where s.is_use=1 ORDER BY ABS(NOW() - s.meeting_begin_date) ASC limit 1 流水 记录 ,一个用户通常会生成许多 记录 如果只要 最新 一条 ,可以借助max来获取. 如文件上传 记录 ,获取文件上传 记录 ,每个用户产生的 最新 一条 记录 : select * from file_record as a inner join ( select file_author,max(file_ctime) as file_ctime from file_record group by file_author) as b on a.file_author=b.file_author and a... 1. 表结构 CREATE TABLE `t_iov_help_feedback` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `USER_ID` int from (select * from question_paper_result where exam_id =#{examId} and is_delete = 1 and finish_status = 4 ORDER BY create_time DESC) temp