【问题标题】:Cursor pagination with limit confilict具有限制冲突的光标分页
【发布时间】:2023-03-19 08:15:01
【问题描述】:

我尝试根据日期创建光标分页。

假设前 11 条记录具有准确的日期值。 我将每页的限制设置为 10。

在挖掘一些游标分页库后,我发现下一个游标具有更大的标识符(在我的情况下标识符是 DateTime )。 因此,如果为第二页编写如下查询,则第一个元素是第 12 条记录,而不是第 11 条。

where date > '10th record date'

而且由于限制,第11条记录也不会显示在第一页。

第一页或第二页上没有第 11 个元素。

我如何解决这个问题?我不能将它与id 混合,因为结果是按date 排序的,并且不能保证id 是有序的。

那么如何创建每页有限制的光标分页?

【问题讨论】:

    标签: mysql sql algorithm pagination


    【解决方案1】:

    您需要一个额外的标识符,以便排序键唯一地定义每一行。让我假设id 是主键。然后你会使用:

    where date > @date or (date = @date and id > @id)
    

    @date@id 将是上一页的最大值。

    在某些数据库中,您可以这样表述:

    where (date, id) > (@date, @id)
    

    在许多数据库中,您可以只使用offset/fetch 进行分页,而不必担心确切的逻辑。

    【讨论】:

    • 正如我在问题中所说,没有保证 id 值已排序。日期不是 created_date,因此新记录可能有最旧的日期,id > @idid < @id 不起作用
    • @AliAkbarAzizi 。 . .这不是这个答案中的表达。过滤条件包括日期和id。
    • id 可以是任何东西。没有更大或更小的保证,我不能按 id 过滤,也不能使用偏移量进行光标分页。
    • 好的,我通过 addint id 按顺序(按日期排序,id )解决了问题。我只有一个问题这种类型表达式的名称是什么? (date, id) > (@date, @id)我搜索mysql,一无所获
    • @AliAkbarAzizi 。 . .该表达式是“元组比较”。并非所有数据库都支持它,但 MySQL 支持:dbfiddle.uk/….
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2021-10-28
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多