动态表中的 SQLite 分页
SQLite pagination in a dynamic table
我有一个SQLite表,它经常更改,每分钟更改很多次。它很容易想象为一个种子表,其中新的种子被附加到表的末尾,旧的种子(已完成)从开头被删除。
这给我实施分页带来了逻辑上的头痛,表中可能有 100 个种子,但表格正在迅速变化。我用C++写这个,用Javascript/HTML编写的GUI。这是我到目前为止的逻辑。我想我知道我需要做什么,但我不知道怎么做。
鉴于:
- UI 将始终根据页面 # 而不是 SQL ID 请求行列表
- UI 将始终设置每页的行数(在此示例中为 10)
- 应用将始终返回到 UI 页面的 # 和当前页面
初始化时,UI 将要求提供第 1 页数据,限制为 10 行。然后应用程序逻辑如下
- 获取表中的行数。(100)
- 获取表中的页数 (100/10) = 10
- 获取前 10 行。这可以通过多种方式完成,例如简单地使用
LIMIT
设置为 10
我可用的应用程序功能如下所示
GetDbRows( startId, limit );
因此,UI(当前)必须知道要开始的行 ID。如果这是一个静态表,这很容易。应用程序将最后一个 ID 返回到 UI。但它是一个动态表,所以这个 ID 没有意义。在请求下一页时,最后一个 ID 实际上可能已经消失。
那么,使用应用程序逻辑,如何正确地将数据库拆分为页面,例如请求页面 2?我可以做到这一点而不必从字面上获取所有行 ID 并拆分它们吗?是否有任何SQL语法可以为我执行此操作?如GET id at page 3
来自Richard Critten
限制后跟偏移量会做您想要的吗,例如从我的表格限制 10 偏移量 20 中选择 * ?请参阅: sqlite.org/lang_select.html 这将为您提供第 3 页
在此处输入图像描述
限制
LIMIT 子句用于对整个 SELECT 语句返回的行数设置上限。
在复合 SELECT 中,只有最后一个或最右边的简单 SELECT 可能包含 LIMIT 子句。在化合物 SELECT 中,LIMIT 子句适用于整个化合物,而不仅仅是最终的 SELECT。如果最右边的简单 SELECT 是 VALUES 子句,则不允许使用 LIMIT 子句。
抵消
LIMIT 子句可以指定两个用逗号分隔的标量表达式,而不是单独的 OFFSET 子句。在这种情况下,第一个表达式用作 OFFSET 表达式,第二个表达式用作 LIMIT 表达式。这是违反直觉的,因为当使用 OFFSET 子句时,两个表达式中的第二个是 OFFSET 和第一个是 LIMIT。这种偏移量和限制的反转是有意的 - 它最大限度地提高了与其他 SQL 数据库系统的兼容性。但是,为了避免混淆,强烈建议程序员使用使用"OFFSET"关键字的LIMIT子句的形式,并避免使用带有逗号分隔偏移量的LIMIT子句。
- 查询SQLite数据库中的日期
- 带内存和隔离功能的SQLite
- 是默认情况下分配给char数组常量的值
- QTableView:endMoveRows在模型中重置水平页眉大小
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 堆分配对于大型块中的分页是否更有效?
- 如何在 QML 中显示来自 QTextDocument 的分页文本?
- 动态表中的 SQLite 分页
- 如果我剩下大量RAM,会发生记忆分页
- 如何在C++应用程序中支持输出分页
- 使用写入函数对 int 表进行分页
- list.h list_del() 给出内核分页错误
- 时钟分页替换算法
- 提升::几何 R*树和分页/延迟加载
- 如何设置QSqlQueryModel的Qt::Vertical headerData在进行分页时增加数字
- 什么会导致分页池增加
- 数组内存分配-分页
- 如何使用std::vector等动态数据结构并防止分页
- 如何防止分页在QTextDocument块或框架
- 使用控制台进行分页