c++ - SQLite 动态表中的分页

标签 c++ mysql sqlite pagination

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

这对我实现分页来说是一个逻辑上的头痛,表中可能有数百个种子,但表正在快速变化。我用 C++ 编写此内容,并使用 Javascript/HTML 编写 GUI。到目前为止,这是我的逻辑。我想我知道我需要做什么,但我不知道怎么做。

<小时/>

给定:

  • UI 将始终请求基于页号的行列表,而不是 SQL Id
  • UI 将始终设置每页的行数(本例中为 10)
  • 应用始终会向界面返回页面数和当前页面
<小时/>

初始化时,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 语法可以帮我做到这一点?如在第3页获取id

最佳答案

来自理查德·克里顿

Will LIMIT followed by OFFSET do what you want eg SELECT * FROM mytable LIMIT 10 OFFSET 20? See: sqlite.org/lang_select.html This would give you the 3rd page

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 子句。

关于c++ - SQLite 动态表中的分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43051320/

相关文章:

php - MySQL 连接两个表

iphone - xcode sqlite3 libsqlite.dylib

shell - 如何返回sqlite3 shell中的提示?

c++ - LD_PRELOAD 的 Makefile __libc_start_main

php - 如何在表格标题中添加图像?

c++ - Boost 编译点云库时出现的问题

php - 简单的mailto集成查询

c# - 内存缓存 - SQLite 与 System.Data.DataTable

c++ - 将 char 数组从 C++ 传递到 Fortran

c++ - 接受并返回 lambda(锁包装器)