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