【问题标题】:Get first row of all pages while also paginating (LIMIT / OFFSET)在分页的同时获取所有页面的第一行(LIMIT / OFFSET)
【发布时间】:2020-05-25 20:47:19
【问题描述】:

我有一个可以按字母顺序排序的条目表(基本上是:单词)。我已经知道总页数,所以我可以显示类似 1 2 3 ... 19 20 带有 OnClick 处理程序以翻到新页面。如果特定页面的结果已经加载,它会简单地显示它,否则会发出一个带有 OFFSET 和 LIMIT 的新 SQL 请求。

现在,当用户将鼠标悬停在页面“3”的链接上时,最好有一个工具提示显示每个页面上的第一个条目。我知道我可以在鼠标悬停上发出请求,但是否可以在第一个查询中获取此列表?

示例表单词

+-ID-+----Word---+
+  1 + ability   +
+  2 + able      +
+  3 + about     +
+  4 + above     +
+  5 + accept    +
+  6 + according +
+  7 + account   +
+----+-----------+

示例初始查询(显然 LIMIT 2 在实际查询中类似于 LIMIT 50

SELECT * FROM words ORDER BY word ASC LIMIT 2 OFFSET 0

进一步查询示例(例如,如果用户点击页面“3”):

SELECT * FROM words ORDER BY word ASC LIMIT 2 OFFSET 4

想要的结果:

我希望有 一个 初始查询,它返回 abilityable(显然),但随后也返回 about(第 2 页的第一项)、accept(第 3 页的第一项)和 account(第 4 页的第一项)。同样,我确信使用 MouseOver 上的事件处理程序或类似的东西会很容易,或者对于两个后续查询也可能不会太难,但如果可能的话,我希望在一个查询中完成。如果“其他页面的第一页”项目的名称不同,那将是最好的,但我想这也会以不同的方式进行管理。初始查询将始终使用OFFSET 0(即用户无法从第 12 页开始)。

目前在 PostgreSQL 版本 12.1

【问题讨论】:

    标签: sql postgresql pagination


    【解决方案1】:

    如果您想要一个返回第 nth 行的查询,您可以使用row_number() 和模运算:

    select w.*
    from (select w.*, row_number() over (order by word) as seqnum
          from words w
         ) w
    where w.seqnum % 50 = 1;
    

    您可以只使用id 来执行此操作,前提是它是连续的、无间隙的、以 1 开头并表示单词的顺序。

    【讨论】:

    • 这将是一个昂贵的查询,因此 OP 可能只想在开始时运行一次。
    • 感谢您抽出宝贵时间对此进行调查。这必须是 UNION 声明的一部分,对吧?因为我确实希望每第 n 行都有第一页 plus 的所有 50 个条目。 @the-impaler 感谢您指出它可能很广泛,将检查(编辑:尝试正确使用“@”...)
    • 对于那些感兴趣的人:我最终使用了 UNION 语句,第一部分具有“NULL AS seqnum”(因此它的行数相同)。在我的情况下,成本是:原始查询:计划时间:17.359 毫秒/执行时间:6.480 毫秒新查询(带有 UNION 子句):计划时间:21.506 毫秒/执行时间:10.538 毫秒(例如,一个条目不多的查询总计)
    猜你喜欢
    • 2013-12-20
    • 2011-08-02
    • 2020-12-30
    • 2015-07-24
    • 2020-11-23
    • 2019-06-23
    • 1970-01-01
    • 2020-03-05
    • 2011-09-12
    相关资源
    最近更新 更多