【问题标题】:Dealing with value based pagination given a number of a page在给定页面数量的情况下处理基于值的分页
【发布时间】:2019-06-25 03:19:47
【问题描述】:

当使用基于值的分页

select * from articles 
where id > @start_value 
limit @page_size

我如何计算@start_value仅给出页码

即:比如说,我有一个网站和 html 页面,其中包含我需要分页的文章列表。但即使要渲染第一页,我也需要以某种方式计算@start_value。来自用户的输入将是他单击的页面的编号;对于第一页,它是 1 - 默认情况下。

  • 鉴于 1,我将如何计算 @start_value

  • 或给定任何随机页面,我仍将如何计算@start_value

请注意,表的id 列的值不一定是连续的,即使id 是自动递增的。

【问题讨论】:

  • 您需要为分页排序,因为表格中的行顺序没有明确定义。

标签: sql postgresql algorithm pagination


【解决方案1】:

首先,没有任何排序的分页并不理想。如果不包含 order by 子句,您无法保证 SQL 将如何对结果进行排序。

你还需要知道页面大小来计算你的起始值,但是给定@page_num@page_size@start_value是由@start_value = @page_num * @page_size;计算的。

这里没有where 子句,而是使用limit/offset

    select * 
    from articles
    order by id
    limit @page_size
    offset (@page_size * @page_num)

【讨论】:

  • 重新阅读我的答案。您需要 page_size 来计算 start_value。您的问题甚至包括查询中的 @pagesize 变量。它是否值得一票否决,因为我指定了这种情况?祝你好运找到答案,伙计。
  • 也许这些会有所帮助:Pagination #1Pagination #2Math behind pagination
  • 知道答案——贴出来。我不需要这些链接。
【解决方案2】:

您不需要“where id > ...”部分。实现这一点的正确方法是使用limit @page_size offset @offset 构造。这样您就不必担心间隙。要根据页码计算偏移量,只需乘以 page_size * page_number。另一个重要的事情是,如果您想始终获得相同的结果,您应该订购您的寄存器。如果您不信任 ID,则可以按日期或其他字段排序。所以:

select * from articles
order by date
limit @page_size
offset (@page_size * (@page_num-1))

注意:我使用 (@page_num-1) 从第 1 页的 0 偏移量开始。

【讨论】:

  • 嘿,为什么要投反对票。正如您所指出的,由于您在 ID 中可能存在空白,因此您所问的内容是不可能的。这就是为什么正确的分页方法是使用记录数的偏移量,而不是像我或@NickDolan 所说的那样在 ID 中使用。
  • 或者说只有你知道的是基于偏移的分页。
  • 你所要求的,也是一个基于偏移的分页(@start_value 是什么,但一个偏移?)。问题是您希望将该偏移量应用于主键 (ID) 而不是记录数。不是说不可能,但由于可能存在空白,它不会正确分页。但是,如果您更喜欢使用 ID,请继续,您可以使用 min() 函数计算第一个值。问候!
  • 不,不是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 2020-01-04
  • 2012-06-02
  • 1970-01-01
  • 2019-12-01
相关资源
最近更新 更多