SQL(graphql) 基于游标的分页,按非唯一列排序

SQL(graphql) cursor based pagination with order by not unique column

假设我们有一个用户 table 具有顺序 id 并希望在按非唯一 updated_at 列排序时使用基于游标的分页(不是 sql 游标) .

我们查询一下:

SELECT * FROM user
LIMIT 3
ORDER BY updated_at asc;

对于table(按updated_at asc,id asc排序):

id updated_at
2 14:00
3 14:00
5 14:00
6 14:00
4 19:00
1 21:00
7 22:00

并获取前 3 行 (2,3,5),我们的光标在最后一行 5 | 14:00,现在我们需要获取 (6,4,1)。

说最好的选择是排序是正确的吗 updated_atid 的独特组合 并在示例中使用 where?

SELECT * FROM user
WHERE updated_at > cursor.updated_at(14:00) 
      OR (updated_at = cursor.updated_at(14:00) AND id > cursor.id(5))
LIMIT 3
ORDER BY updated_at asc, id asc;

如果这个查询是正确的,索引怎么办?我应该始终创建两个索引 updated_at asc, id ascupdated_at desc, id asc 还是单个 updated_at 就足够了?

graphql 中的游标有什么作用?它应该是 String 类型,所以我应该将其字符串化为 ${id}_${updated_at} 以传递(将其解析为 sql 查询返回 idupdated_at)或我应该只保存 id 并预取 updated_at 以便此 id 在查询中使用吗?

除了 LIMIT 的位置和使用未加引号的保留字作为 table 名称之外,您的查询是正确的,但是通过元组比较可以写得更好。

SELECT * FROM "user"
WHERE (updated_at,id) > (cursor.updated_at, cursor.id)
ORDER BY updated_at asc, id asc
LIMIT 3;

不仅更干净,而且还能有效地使用 (updated_at asc, id asc) 上的索引。元组比较的一个怪癖是没有办法描述不一致方向的顺序,但你似乎并不需要它。 (如果“id”是一个整数,你可以直接否定它来实现)

我无法回答你问题的 graphql-specific 部分。