动态表中的SQLite分页

时间:2017-03-27 16:06:31

标签: c++ mysql sqlite pagination

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

这对我来说是一个合乎逻辑的头痛问题,实施分页,桌子上可能有100多个种子,但表格正在快速变化。我用C ++编写这个,用Javascript / HTML编写的GUI。到目前为止,这是我的逻辑。我想我知道我需要做什么,但我不知道怎么做。

假设:

  • UI将始终根据页面#而不是SQL Ids
  • 请求行列表
  • UI将始终设置每页的行数(例如10个)
  • 应用程序将始终返回UI页面和当前页面

在初始化时,UI将要求第1页数据,限制为10行。然后应用程序逻辑如下

  1. 获取表格中的行数。 (100)
  2. 获取表格中的页数(100/10)= 10
  3. 获取前10行。这可以通过多种方式完成,例如简单地使用LIMIT设置为10
  4. 我可用的应用程序功能看起来像这样

    GetDbRows( startId, limit );

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

    因此,使用应用程序逻辑,如何正确地将数据库拆分为页面,并询问第2页?我可以这样做而不必逐字地获取所有行ID并拆分它们吗?是否有任何SQL语法为我这样做?例如GET id at page 3

1 个答案:

答案 0 :(得分:0)

来自Richard Critten

  

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

enter image description here

<强> LIMIT

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

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

<强> OFFSET

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