You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLite中获取事件的上一个/下一个ID

事件上下链接的SQL解决方案问题

现有事件数据

sqlite> select id, date, name from event;
1|2025-04-30|april event
2|2025-05-02|may 2 event
3|2025-05-01|May Day morning
4|2025-05-01|May Day tour

需求说明

需实现getPrev()和getNext()逻辑,满足以下规则:

  • getPrev(1) 返回 null,getNext(1) 返回 3
  • getPrev(2) 返回 4,getNext(2) 返回 null
  • getPrev(3) 返回 1,getNext(3) 返回 4
  • getPrev(4) 返回 3,getNext(4) 返回 2

注:同一日期下的事件顺序不做强制要求

过往尝试及问题

简单SQL语句尝试

SELECT 'prev for 3 is:', id, date, name
 FROM event
 WHERE date <= '2025-05-01'
 AND id != 3
 ORDER BY date DESC, id DESC
 LIMIT 1;

SELECT 'next for 3 is:', id, date, name
 FROM event
 WHERE date >= '2025-05-01'
 AND id != 3
 ORDER BY date ASC, id ASC
 LIMIT 1;

执行后出现异常:5月1日的两个事件得到完全相同的上下链接结果:

prev for 3 is:|4|2025-05-01|May Day tour
next for 3 is:|4|2025-05-01|May Day tour

带分子查询的SQL尝试

SELECT 'prev for 3 is:', id, date, name FROM (
    SELECT id, date, name
     FROM event
     WHERE date <= '2025-05-01'
     AND id != 3
     ORDER BY date DESC, id DESC
     LIMIT (
        select count(*)
        from event
        where date = '2025-05-01'
    )
)
ORDER BY id DESC
LIMIT 1;

SELECT 'next for 3 is:', id, date, name FROM (
    SELECT id, date, name
     FROM event
     WHERE date >= '2025-05-01'
     AND id != 3
     ORDER BY date ASC, id ASC
     LIMIT (
        select count(*)
        from event
        where date = '2025-05-01'
    )
)
ORDER BY id ASC
LIMIT 1;

对id=4执行后仍得到错误结果:

prev for 3 is:|4|2025-05-01|May Day tour
next for 3 is:|2|2025-05-02|may 2 event -- 此处应为#4 May Day tour
prev for 4 is:|3|2025-05-01|May Day morning
next for 4 is:|2|2025-05-02|may 2 event -- 或此处应为#3 May Day Morning

问题核心

ID与日期为独立排序维度,同一日期的事件处于无序集合,无法直接通过where id < ?这类约束区分同一日期内的上下事件。

目前已通过代码实现需求,但希望找到纯SQL的解决方案。

内容的提问来源于stack exchange,提问作者Kevin G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:01:11