【问题标题】:SQLite pagination in a dynamic table动态表中的 SQLite 分页
【发布时间】:2017-08-20 10:49:00
【问题描述】:

我有一个经常更改的 SQLite 表,每分钟更改很多次。它很容易被想象成一个种子表,其中新的种子被附加到表的末尾,而旧的种子(已完成)从一开始就被删除。

这让我在实现分页时感到头疼,表格中可能有 100 多个种子,但表格正在迅速变化。我正在用 C++ 编写这个,GUI 是用 Javascript/HTML 编写的。到目前为止,这是我的逻辑。我想我知道我需要做什么,但我不知道该怎么做。


鉴于:

  • UI 将始终根据页面编号而不是 SQL Id 要求提供行列表
  • UI 将始终设置每页的行数(本例中为 10)
  • 应用程序将始终返回 UI 页面数和当前页面

在初始化时,UI 将要求数据的第 1 页,限制为 10 行。那么应用逻辑如下

  1. 获取表中的行数。 (100)
  2. 获取表格的页数(100 / 10) = 10
  3. 获取前 10 行。这可以通过多种方式完成,例如简单地将LIMIT 设置为 10

我可用的应用程序功能看起来像这样

GetDbRows( startId, limit );

因此,UI(当前)必须知道开始的行 ID。如果这是一个静态表,这很容易。应用程序将最后一个 ID 返回给 UI。但它是动态表,所以这个ID没有意义。在请求下一页时,最后一个 ID 实际上可能已经消失。

那么,使用应用程序逻辑,我怎样才能正确地将数据库拆分为页面,并请求页面 2,例如?我可以做到这一点而不必从字面上获取所有行 ID 并拆分它们吗?是否有任何 SQL 语法可以为我执行此操作?如GET id at page 3

【问题讨论】:

  • LIMIT 后跟 OFFSET 会做你想要的,例如 SELECT * FROM mytable LIMIT 10 OFFSET 20?请参阅:sqlite.org/lang_select.html 这将为您提供第 3 页
  • 美丽..谢谢

标签: c++ mysql sqlite pagination


【解决方案1】:

来自理查德·克里顿

LIMIT 后跟 OFFSET 会做你想要的,例如 SELECT * FROM mytable LIMIT 10 OFFSET 20?请参阅:sqlite.org/lang_select.html 这将为您提供第三页

enter image description here

限制

LIMIT 子句用于设置整个 SELECT 语句返回的行数的上限。

在复合 SELECT 中,只有最后一个或最右边的简单 SELECT 可以包含 LIMIT 子句。在复合 SELECT 中,LIMIT 子句适用于整个复合,而不仅仅是最终的 SELECT。如果最右边的简单 SELECT 是 VALUES 子句,则不允许有 LIMIT 子句。

偏移量

LIMIT 子句可以指定两个用逗号分隔的标量表达式,而不是单独的 OFFSET 子句。在这种情况下,第一个表达式用作 OFFSET 表达式,第二个用作 LIMIT 表达式。这是违反直觉的,因为当使用 OFFSET 子句时,两个表达式中的第二个是 OFFSET,第一个是 LIMIT。这种偏移和限制的反转是有意的——它最大限度地提高了与其他 SQL 数据库系统的兼容性。但是,为避免混淆,强烈建议程序员使用使用“OFFSET”关键字的 LIMIT 子句形式,并避免使用带有逗号分隔偏移量的 LIMIT 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2022-01-12
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多