我有一个SQLite表经常变化,每分钟很多次。它很容易被想象成一个种子表,其中新的种子被附加到表的末尾,而旧的种子(已完成)从一开始被删除。
这对我来说是一个合乎逻辑的头痛问题,实施分页,桌子上可能有100多个种子,但表格正在快速变化。我用C ++编写这个,用Javascript / HTML编写的GUI。到目前为止,这是我的逻辑。我想我知道我需要做什么,但我不知道怎么做。
假设:
在初始化时,UI将要求第1页数据,限制为10行。然后应用程序逻辑如下
LIMIT
设置为10 我可用的应用程序功能看起来像这样
GetDbRows( startId, limit );
因此UI(当前)必须知道要开始的行ID。如果这是一个静态表,这很容易。应用程序将最后一个ID返回给UI。但它是一个动态表,所以这个ID没有意义。在下一页被请求时,最后的ID实际上可能已经消失。
因此,使用应用程序逻辑,如何正确地将数据库拆分为页面,并询问第2页?我可以这样做而不必逐字地获取所有行ID并拆分它们吗?是否有任何SQL语法为我这样做?例如GET id at page 3
答案 0 :(得分:0)
来自Richard Critten
LIMIT后跟OFFSET会做你想做的事情,例如SELECT * FROM mytable LIMIT 10 OFFSET 20?请参阅:sqlite.org/lang_select.html这将为您提供第3页
<强> LIMIT 强>
LIMIT子句用于为整个SELECT语句返回的行数设置上限。
在复合SELECT中,只有最后或最右边的SELECT可能包含LIMIT子句。在复合SELECT中,LIMIT子句适用于整个复合,而不仅仅是最终的SELECT。如果最右边的SELECT是一个VALUES子句,则不允许使用LIMIT子句。
<强> OFFSET 强>
LIMIT子句可以指定由逗号分隔的两个标量表达式,而不是单独的OFFSET子句。在这种情况下,第一个表达式用作OFFSET表达式,第二个表达式用作LIMIT表达式。这是违反直觉的,因为当使用OFFSET子句时,两个表达式中的第二个是OFFSET,第一个是LIMIT。这种偏移和限制的逆转是有意的 - 它最大化了与其他SQL数据库系统的兼容性。但是,为避免混淆,强烈建议程序员使用使用“OFFSET”关键字的LIMIT子句的形式,并避免使用带逗号分隔偏移量的LIMIT子句。