【问题标题】:How to get total possible result set from a pagination type query?如何从分页类型查询中获取全部可能的结果集?
【发布时间】:2020-05-10 02:29:43
【问题描述】:

我在 AS3 AIR 中使用 SQLLite,并像下面的示例查询一样分页(每页 100 个结果):

SELECT * FROM table1 WHERE col1 LIKE "%my keywords here%" LIMIT 100 OFFSET 0

它工作正常 - 当用户点击下一个或上一个按钮时,我会更改偏移量。所以next按钮的后续查询是:

SELECT * FROM table1 WHERE col1 LIKE "%my keywords here%" LIMIT 100 OFFSET 100

只是想知道是否有可能获得可能结果的总数,以便我可以 dsiplay 'page 3 of 12' 等?还是我必须执行两个查询 - 第一个是不带 LIMIT 和 OFFSET 的 count(*) 所以我得到结果总数,然后是上面的查询来得到实际的页面结果?

感谢您的时间和帮助。

【问题讨论】:

    标签: sqlite pagination


    【解决方案1】:

    SQLite 会即时计算结果记录,因此无法知道没有LIMIT 会获得多少记录;你必须使用COUNT(*)

    请注意,除非您使用ORDER BY,否则无法保证记录的顺序。 此外,较大的OFFSET 值非常低效;您应该在当前页面的最后一个值之后继续(请参阅Scrolling Cursor)。

    【讨论】:

    • 感谢 CL - 滚动光标页面对我来说很有意义。只是为了澄清重新使用 COUNT(*) 来获取总结果集 - 这必须作为一个 seaparte 查询来完成,对,即没有办法将它包含在实际显示结果的查询中?
    • 一个查询返回一个具有固定数量或行和列的结果表;包括COUNT(*) 有足够的扭曲是可能的,但没有意义。
    • 关于滚动光标 - 它似乎只有在您有搜索词时才有效。如果您想使用下一个或上一个按钮进行分页以浏览整个数据集,按标题排序怎么办?向前翻页时,您在查看最后一行时存储了什么?我认为您不能使用该行的 ID 号,因为您的行可能不是按字母顺序排列的。有办法吗?
    • 我应该澄清一下 - 有没有办法不使用大偏移量?使用偏移量执行此操作最多需要 10 秒才能从 180 000 个集合中返回结果。
    • 你总是有 some 顺序(如果你不使用ORDER BY,你会得到随机结果,并且分页没有意义)。您使用该列的值来标识最后一行(或者,如果该列不包含唯一值,则使用多个列)。
    【解决方案2】:

    在最新版本的 SQLite(3.25.0 及更高版本)中,支持window functions。这可能不是最有效的方法,但您可以在同一查询中获取记录总数,如下所示:

    SELECT *, COUNT() OVER() AS totalCount  FROM dt_fi_business_account WHERE fi_name LIKE "%cre%" LIMIT 10 OFFSET 0
    

    请记住,每行都会返回总计数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多