键集分页并在键集中交替排序顺序?

问题描述 投票:0回答:1

我有一个名为

event
的表,其中包含
id
(uuidv4)、
name
description
created_at
updated_at
列。

我正在尝试理解“按键集分页”。这是我现在的理解:

基础查询(第一页):

SELECT * 
FROM event 
ORDER BY created_at, id ASC 
LIMIT 3

第二个查询(第二页):

SELECT * 
FROM event 
WHERE (created_at, id)
    > ('2024-02-09 14:21:52+00', '7aa20cad-3a8f-45cb-bee2-2115d4ad1c20') 
ORDER BY created_at, id ASC 
LIMIT 3;

这非常有效。但我有一些我不明白的用例。

  1. 当我想通过

    created_at DESC
    id DESC
    订购时会发生什么?

  2. 如果我想通过

    name DESC
    订购,该如何操作?
    SELECT * from event ORDER BY name DESC, created_at, id ASC LIMIT 3
    。但是当使用游标获取时它是如何工作的呢?我知道我必须在光标中包含名称,但我不明白元组过滤器会是什么样子:

     SELECT * 
     FROM event 
     WHERE (name created_at, id)
         > ('Name 9', '2024-02-09 14:21:52+00', '7aa20cad-3a8f-45cb-bee2-2115d4ad1c20') 
     ORDER BY created_at, id ASC 
     LIMIT 3;
    

    像这样?但是

    <
    >
    运算符与排序不相关吗?

有人可以指出可以很好解释的资源,或者在这里解释吗?

sql postgresql pagination keyset-pagination
1个回答
0
投票

具有索引支持的“键集分页”(唯一表现良好的类型)基于行构造函数比较。该比较对行中的每个字段使用相同的运算符。并且索引必须同意这一点:以相同的顺序使用相同的字段,并且全部按升序或降序排序。 您不能在查询或索引中混合升序和降序。 请参阅:

因此,谨防排序顺序中未定义的列

NOT NULL
NULL
默认排序在最后
ASCENDING
排序顺序(以及第一个 ind
DESCENDING
顺序),但行值比较如下:

WHERE (name, created_at, id) > ('Name 9', '...', '...')

... 完全排除

name
中具有空值的行说明书:

对于

<
<=
>
>=
情况,比较行元素 从左到右,一旦元素对不相等或为空就停止 被发现。如果这对元素中的任何一个为 null,则结果为 行比较未知(空);否则比较这个 元素对决定结果。例如,
ROW(1,2,NULL) < ROW(1,3,0)
产生 true,而不是 null,因为第三对元素 不予考虑。

© www.soinside.com 2019 - 2024. All rights reserved.