【问题标题】:sqlite3, adjacent rows (before and after)sqlite3,相邻行(之前和之后)
【发布时间】:2014-08-03 23:27:48
【问题描述】:

我有一张桌子:

table (
 pk int auto_increment, 
 ctx int not null, 
 msg text not null
)

我想选择,给定一些 PK,前 10 行和后 10 行。问题是,我不能像这样依赖 PK (select * from table where pk v_pk-10) 因为它们不相邻,可能有一行与结果无关,给定' ctx'。

谢谢!

【问题讨论】:

  • 请注意,关系数据库中没有 adjacent 这样的东西。您不知道/不应该假设数据是如何存储的,或者如何检索数据。您需要做的是使用ORDER BY 子句强加一个命令,然后只选择您需要的数据。
  • 什么?抱歉,没看懂。当然有顺序,给定特定的数字 PK。

标签: sql select sqlite


【解决方案1】:

你可以试试这个:

(select t.*
 from table t.*
 where pk <= YOURVALUE
 order by pk desc
 limit 11
) union all
(select t.*
 from table t.*
 where pk > YOURVALUE
 order by pk asc
 limit 10
)

order by 不应该真正进行排序,因为您是按主键排序的。

【讨论】:

    【解决方案2】:

    据我所知,没有简单 方法可以“获取值的任一侧的 n 行”。关系数据库是基于集合的,而不是基于位置的。

    你可以试试这样的:

        SELECT *
        FROM SO25110036 as a
        WHERE 
        a.pk = 11
        OR
        (
         a.pk < 11
         and 3 >= 
          (select count(*)
           from SO25110036 as b
           where b.pk >= a.pk
           and b.pk < 11
           )
         )
        OR
        (
         a.pk > 11
         and 3 >= 
          (select count(*)
           from SO25110036 as c
           where c.pk <= a.pk
           and c.pk > 11
           )
         )
        order by pk
        ;
    

    我在这里实现了一个小提琴:http://sqlfiddle.com/#!7/b4595/4
    出于测试目的,它在具有 11 值的行的两侧以及该行中获得 3 行。另外,请尝试不使用ORDER BY

    使用 sqlite 特定语法可能有更好的解决方案,但我不是 sqlite 用户。

    【讨论】:

    • 是的,我考虑过,但我担心选择计数(*)太慢了...谢谢
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 2016-05-13
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多