postgresql - 如何在字母数据上查找/键集分页
问题描述
- 我有 2 张桌子
资源
resource_votes_aggregate存储每个 resource_id 的点赞数
我想使用搜索/键集分页按标题的降序对资源进行分页
没有分页,这就是你得到的
- 我想要 5 个批次的结果,因为我一次分页 5 个结果
我的 PAGE 1 查询使用下面的查询没有问题
SELECT
r.resource_id,
title,
COALESCE(likes, 0) AS likes
FROM
resources r
LEFT JOIN
resource_votes_aggregate a
ON r.resource_id = a.resource_id
WHERE
category_id = 1
ORDER BY
title DESC,
resource_id DESC LIMIT 5;
- 如何使用键集/搜索分页获取下一页?
我的尝试
SELECT
r.resource_id,
title,
COALESCE(likes, 0) AS likes
FROM
resources r
LEFT JOIN
resource_votes_aggregate a
ON r.resource_id = a.resource_id
WHERE
category_id = 1
AND
(
likes,
title
)
< (586, 'Zatoichi Meets Yojimbo (Zatôichi to Yôjinbô) (Zatôichi 20)')
ORDER BY
title DESC,
resource_id DESC LIMIT 5;
结果不正确
更新 1
我创建了一个加载 20 个结果的FIDDLE HER E?如何使用搜索分页以 5 个为一组进行分页?
解决方案
有两个选项可以满足您的需要:
OFFSET n FETCH FIRST n ROWS ONLY
和sort_column > last_val
示例 1:
SELECT
r.resource_id,
title,
COALESCE(likes, 0) AS likes
FROM
resources r
LEFT JOIN
resource_votes_aggregate a
ON r.resource_id = a.resource_id
WHERE
category_id = 1
AND
(
likes,
title
)
< (586, 'Zatoichi Meets Yojimbo (Zatôichi to Yôjinbô) (Zatôichi 20)')
ORDER BY
title DESC,
resource_id DESC
OFFSET 5
FETCH FIRST 5 ROWS ONLY;
然后,您只需每次更改 OFFSET 值。
然后另一种方法是跟踪应用层中的 title 和 resource_id,然后将其传递给查询,以便进一步从结果集开始:
SELECT
r.resource_id,
title,
COALESCE(likes, 0) AS likes
FROM
resources r
LEFT JOIN
resource_votes_aggregate a
ON r.resource_id = a.resource_id
WHERE
category_id = 1
AND
(
likes,
title
)
< (586, 'Zatoichi Meets Yojimbo (Zatôichi to Yôjinbô) (Zatôichi 20)')
AND
(title,resource_id) > (last_title_id_from_before,last_resource_id_from_before)
ORDER BY
title DESC,
resource_id DESC LIMIT 5;
这将确保您跳过前一页中的行,但是这种策略的缺点是您无法再次返回页面。
推荐阅读
- azure - 从 Windows 桌面应用程序调用具有 AD 授权的 Azure 函数
- if-statement - Ansible 中参数的 if 条件
- flutter - 如何验证 Stepper 中的每个表单步骤
- python - 在 Python 中使用凭据连接到 SQL Server
- powershell - Windows 注册表中的 OpenType 字体
- android - 从库项目中杀死一个应用程序进程
- reactjs - ReactJS 从另一个组件调用一个函数
- python-3.x - ModuleNotFoundError:没有名为“keybord”的模块
- javascript - VueJS“RangeError:超出最大调用堆栈大小”
- azure - 如何将我的 GoDaddy 域连接到 Azure VM 服务器?