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_at
和 id
的独特组合
并在示例中使用 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 asc
和 updated_at desc, id asc
还是单个 updated_at
就足够了?
graphql 中的游标有什么作用?它应该是 String
类型,所以我应该将其字符串化为 ${id}_${updated_at}
以传递(将其解析为 sql 查询返回 id
和 updated_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 部分。
假设我们有一个用户 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_at
和 id
的独特组合
并在示例中使用 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 asc
和 updated_at desc, id asc
还是单个 updated_at
就足够了?
graphql 中的游标有什么作用?它应该是 String
类型,所以我应该将其字符串化为 ${id}_${updated_at}
以传递(将其解析为 sql 查询返回 id
和 updated_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 部分。