获取当前数据的上一条,下一条的 MySQL 代码:
WITH RankedRecords AS (
SELECT *,
LEAD(id) OVER (ORDER BY time ASC) AS next_id,
LAG(id) OVER (ORDER BY time ASC) AS prev_id
FROM records
)
SELECT r.id, r.time, -- 其他字段
CASE
WHEN r.id = @CurrentID THEN 'Current' -- @CurrentID 是当前id
WHEN r.prev_id = @CurrentID THEN 'Previous'
WHEN r.next_id = @CurrentID THEN 'Next'
END AS record_type
FROM RankedRecords r
WHERE r.id = @CurrentID OR r.prev_id = @CurrentID OR r.next_id = @CurrentID
ORDER BY CASE WHEN record_type = 'Previous' THEN 1 ELSE 2 END, r.time ASC;
代码是一言生成的,测试达到了效果,想问问数据库大佬,这段代码如果对大量数据的查询会影响性能吗,像这一行:
SELECT *,
LEAD(id) OVER (ORDER BY time ASC) AS next_id,
LAG(id) OVER (ORDER BY time ASC) AS prev_id
FROM records
数据库结构:
id | time | ···一些其他列 |
---|---|---|
2 | 12345660 | ··· |
3 | 12345640 | ··· |
5 | 12345670 | ··· |
查询id=2,以time排序:
id | time | ···一些其他列 | record_type |
---|---|---|---|
3 | 12345640 | ··· | Previuous |
5 | 12345670 | ··· | Next |
2 | 12345660 | ··· | Current |
查询id=3:
id | time | ···一些其他列 | record_type |
---|---|---|---|
2 | 12345660 | ··· | Next |
3 | 12345640 | ··· | Current |
WITH RankedRecords AS (
SELECT id, time, -- 只选择需要的列
LEAD(id) OVER (ORDER BY time ASC) AS next_id,
LAG(id) OVER (ORDER BY time ASC) AS prev_id
FROM records
)
SELECT r.id, r.time, -- 其他字段
CASE
WHEN r.id = @CurrentID THEN 'Current' -- @CurrentID 是当前id
WHEN r.prev_id = @CurrentID THEN 'Previous'
WHEN r.next_id = @CurrentID THEN 'Next'
END AS record_type
FROM RankedRecords r
WHERE r.id = @CurrentID OR r.prev_id = @CurrentID OR r.next_id = @CurrentID
ORDER BY CASE WHEN record_type = 'Previous' THEN 1 ELSE 2 END, r.time ASC;
该段代码使用了 MySQL 的窗口函数(LEAD
和 LAG
)以及公用表表达式(CTE,即 WITH
子句),来查询当前数据行的前一条和后一条记录。这种查询方式在中等大小的数据集上通常是高效的,但在处理大量数据时,性能可能会受到影响,特别是如果 records
表非常大,或者没有适当的索引来支持 ORDER BY time ASC
排序。
对于性能优化,你可以考虑以下几点:
time
列有索引,这样 ORDER BY
操作可以更快地进行。WHERE
子句中添加额外的条件来限制返回的数据量,但这已经在你提供的查询中做到了。EXPLAIN
关键字来查看查询的执行计划,检查是否使用了索引以及是否有任何潜在的性能瓶颈。records
表非常大,并且数据可以按某种方式分区(例如按日期),那么可以考虑使用 MySQL 的分区功能来提高性能。关于你提到的这一行:
SELECT *,
LEAD(id) OVER (ORDER BY time ASC) AS next_id,
LAG(id) OVER (ORDER BY time ASC) AS prev_id
FROM records
这一行本身并不会对性能产生特别大的影响,只要 time
列有索引并且表的大小不是极端的大。然而,它确实需要对整个 records
表进行排序操作,这是查询中最耗时的部分之一。
总的来说,对于中等大小的数据集,这个查询应该是足够高效的。但对于大数据集,你可能需要采取一些额外的措施来优化性能。
数据表结构如下 id,date(时间戳),categoryid(类型id) 数据查询 select id,categoryid,date from table order by categoryid asc,date desc 以上查询会返回n条数据,然后通过程序遍历可以取某id前一id,及后一id,但是有的时候可能会查询到上万条数据,相对来说效率不高,有没有mysq查询最高效的其它方法?
MySQL 查询 WHERE 是条件多一点查询快还是少一点查询快 t_table 表有多个字段 type, name... type是 tinyint 类型,name是 varchar 类型 这两个条语句哪个会更快
本文向大家介绍MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据),包括了MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)的使用技巧和注意事项,需要的朋友参考一下 开发背景: 最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性。
我使用的是+++。 我得到了4个DELETE,只想要一个数据库请求,所以我用一个“;”连接了DELETE命令...但总是失败。 它会抛出以下错误: 但如果我将此SQL粘贴到PhpMyAdmin中,它总是成功的... 如果我在单个查询中编写它,它也会成功。 多谢帮忙!
问题内容: 我正在使用+ + + 。 我有4个DELETE,并且只需要1个数据库请求,因此我将DELETE命令与“;” …相连,但是它总是失败。 它引发此错误: 但是,如果我将此SQL粘贴到PhpMyAdmin中,它将始终成功… 如果我在单个查询中写它也是成功的。 感谢帮助! 问题答案: 我猜您正在使用node-mysql。( 但也应该适用于 node- mysql2 ) 该文件说: 出于安全原因
本文向大家介绍一千万条数据的表, 如何分页查询?相关面试题,主要包含被问及一千万条数据的表, 如何分页查询?时的应答技巧和注意事项,需要的朋友参考一下 数据量过大的情况下, limit offset分页会由于扫描数据太多而越往后查询越慢. 可以配合当前页最后一条ID进行查询, SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT}. 当然, 这种情况下ID必