gpt4 book ai didi

sql - 如何在 SQL 查询中使用排序方式实现 GraphQL 游标

转载 作者:行者123 更新时间:2023-12-03 08:27:08 25 4
gpt4 key购买 nike

我有一个数据库表reviews,其中包含id rating,其中id是自动递增的,而 rating 是 0 到 100 之间的整数。

我正在尝试在 GraphQL API 中创建基于游标的分页,但正在努力为 hasPreviousPagehasNextPage 创建必要的查询。

这是我的数据:

ID: 1, RATING: 50
ID: 2, RATING: 80
ID: 3, RATING: 20
ID: 4, RATING: 40
ID: 5, RATING: 60

以下是 GQL 查询的示例:

reviews(first: 3)

哪个返回

ID: 1, RATING: 50
ID: 2, RATING: 80
ID: 3, RATING: 20

带有页面信息

hasPreviousPage: false
hasNextPage: true

pageInfo 的查询将是

hasPreviousPage = SELECT COUNT(*) > 0 FROM reviews WHERE id < 0;
hasNextPage = SELECT COUNT(*) > 0 FROM reviews WHERE id > 3;

我的问题是按评级排序时出现的。进行与之前类似的查询:

reviews(sort: "rating", first: 3)

哪个返回

ID: 3, RATING: 20
ID: 4, RATING: 40
ID: 1, RATING: 50

带有页面信息

hasPreviousPage: false
hasNextPage: true

但是如何像以前一样创建 hasPreviousPagehasNextPage 查询?

hasPreviousPage = SELECT COUNT(*) > 0 FROM reviews WHERE ???
hasNextPage = SELECT COUNT(*) > 0 FROM reviews WHERE ???

在这种情况下,WHERE 子句应该是什么?查询是否需要使用子查询变得更加复杂?我不确定我错过了什么。

最佳答案

您实际上不需要对 hasPreviousPagehasNextPage 进行任何数据库查询。您需要应用 +2 技巧来实现此目的(假设您想要为之前和之后的情况实现 hasPreviousPage)。

假设您有以下查询:

// `after` should be URL-safe encoded
// `id` must have a monotonic sort order, a ULID is a fine choice for an id
// if ULID is not an option for some reason, chose a different column that has a monotonicity to it, e.g. `created_at`
reviews(first: 3, after: "id:12345;sort_cols:user_id")

您想要做的是查询前 5 条评论:

SELECT *
FROM reviews
WHERE id >= ?
ORDER BY ? ASC
LIMIT 5;

-- result: 12345, 12346, 12347, 12348, 12349
-- from the app return (after computing `pageInfo`): 12346, 12347, 12348

如果第一个结果的id与光标中的id匹配,即12345,则表示存在上一页。如果存在上一页并且返回的行数为 4 或更少,则 hasNextPage: false。如果没有上一页,并且返回的行数为 4 或更多,则 hasNextPage: true

在返回结果之前,请确保过滤掉与光标 ID (12345) 匹配的项目以及一个额外的项目(如果有下一页)。

请注意,必须正确生成 SQL。查询将根据分页方向(beforeafter)而变化。如果您想支持范围请求,即同时提供 beforeafter 的请求,它也会变得更加复杂。

示例:

reviews(first: 3, before: "id:12345;sort_col:user_id")

这里你想使用降序。另外,您需要过滤 ids <= 光标处的 id。

SELECT *
FROM reviews
WHERE id <= ?
ORDER BY ? DESC
LIMIT 5;

-- result: 12345, 12344, 12343, 12342, 12341
-- from the app return (after computing `pageInfo`): 12344, 12343, 12342

关于sql - 如何在 SQL 查询中使用排序方式实现 GraphQL 游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66293431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com