MYSQL 查询最近一条记录的sql语句
下策——查询出结果后将时间排序后取第一条
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
select * from a
where create_time<="2017-03-29 19:30:36"
order by create_time desc
limit 1
这样做虽然可以取出当前时间最近的一条记录,但是一次查询需要将表遍历一遍,对于百万以上数据查询将比较费时;limit是先取出全部结果,然后取第一条,相当于查询中占用了不必要的时间和空间;还有如果需要批量取出最近一条记录,比方说:“一个订单表,有用户,订单时间,金额,需要一次性查询所有用户的最近的一条订单记录”,那么每个用户一次查询就要做一次整表的遍历,数据大的情况下,时间将会以指数形式增长,不能投入实际使用。
mybatis plus 语法:
<select id="queryEnvironmentRecordViewByTime" resultType="org.jeecg.modules.environment.vo.EnvironmentVo">
<!--SELECT * FROM dcq_data_environment t
ORDER BY t.time DESC LIMIT 1
-->
<!--SELECT *,MAX(t.time) FROM dcq_data_environment t
GROUP BY t.monitor_code
-->
SELECT * FROM dcq_data_environment t
<where>
<if test="monitorCode!=null and monitorCode!=''">
AND t.monitor_code<![CDATA[ = ]]>#{monitorCode}
</if>
<if test="registerFlag!=null and registerFlag!=''">
AND t.register_flag<![CDATA[ = ]]>#{registerFlag}
</if>
<if test="time!=null and time!=''">
AND t.time<![CDATA[ <= ]]>#{time}
</if>
</where>
ORDER BY t.time DESC LIMIT 1
</select>
中策——查询排序后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最大一条记录。这样就很好的实现了批量查询最近记录,并且仅仅需要遍历一次表,即使在数据量巨大的情况下也可以在很短的时间查出结果。
测试不可用
SELECT * FROM dcq_data_environment t WHERE t.monitor_code = "0003" AND t.time <= "2020-07-13 13:03:09" AND t.register_flag = "1" GROUP BY t.id ORDER BY t.time DESC LIMIT 1
亲测可用
例子
现在有一张资产设备表: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;
上策
···
SELECT * FROM dcq_data_environment t WHERE t.monitor_code = “0003” AND t.time <= “2020-07-13 13:03:09” AND t.register_flag = “1” GROUP BY t.id ORDER BY t.time DESC LIMIT 1
···
此命令只查询一条
本文地址:https://blog.csdn.net/qq_41722795/article/details/107320190
上一篇: 如何在linux的vi编辑器下删除前N行
下一篇: 建立产品索引
推荐阅读
-
mysql TIMESTAMP(时间戳)详解查询最近一段时间操作的记录_MySQL
-
mysql 剔除子查询中的记录语句
-
MySQL开启记录执行过的SQL语句方法_MySQL
-
sql 查询本年、本月、本日记录的语句,附SQL日期函数
-
MySQL5.6如何优化慢查询的SQL语句--慢日志介绍_MySQL
-
mysql - 怎样记录thinkphp函数生成的数据库查询语句呢?
-
mysql-求助MySQL的关于sql语句怎么写??三表的查询~~~请大神进来帮忙~~~~~
-
用SQL语句删除重复记录的四种方法_MySQL
-
sql server 查询记录平均值及并排序 的语句
-
mysql中sql实现查询当天、昨天、本月、季度的语句