【问题标题】:Mysql: Get next and previous in duplicated recordsMysql:在重复记录中获取下一个和上一个
【发布时间】:2020-08-18 03:46:48
【问题描述】:

我的数据库有两列 ID 和 Timestamp。

4  1597228600
8  1597228700
12 1597228700
11 1597228800
14 1597228800
9  1597228900
10 1597228900
1  1597228900
2  1597229000

我需要获取给定 id 和时间戳的下一个(上一个)记录,按时间戳排序。如果时间戳有重复,则应该返回id较高(较低)的记录。

在示例中 11(1597228800) 的 Next 和 Prev 记录是 14 和 12。14(1597228800) 的 Next 和 Prev 记录是 1 和 11。

我尝试在子查询中使用 CASE 条件,但是这个解决方案有问题

SELECT id 
FROM tbl 
WHERE timestamp_value >= '1597228800' 
AND id > (case when ( SELECT min(id) min_id FROM tbl WHERE id > 11 AND timestamp_value = 1597228800) is null then 0 else 11 end) 
ORDER BY timestamp_value
LIMIT 1

【问题讨论】:

  • 14 是 11 的下一条记录。说明:14 和 11 的记录具有相同的时间戳,因此具有相同时间戳的 id 较高的记录是下一个,在当前示例中为 14 .
  • 你的MySql是什么版本的?
  • MySQL 版本为 5.7
  • 所以如果所有时间戳都相等,那么我们只是按 id 排序?
  • @Strawberry 是的。但是在示例中,一些 ID 较低的记录具有较高的时间戳,所以我不能使用 ID 作为 ORDER BY 语句中的第二个参数。

标签: mysql performance


【解决方案1】:

我认为这样可以:

select t.* 
from tablename t 
cross join (select * from tablename where id = ?) i
where t.id in (
  (
    select id from tablename 
    where (id < i.id and timestamp = i.timestamp) or timestamp < i.timestamp
    order by timestamp desc, id desc limit 1
  ),  
  (
    select id from tablename 
    where (id > i.id and timestamp = i.timestamp) or timestamp > i.timestamp
    order by timestamp, id limit 1
  ) 
)

? 替换为您要搜索的id
2 个子查询返回 ? 的前一个和下一个 id 的 id。
请参阅demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2012-02-10
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多