首页 > 解决方案 > 如何在字母数据上查找/键集分页

问题描述

资源

在此处输入图像描述

resource_votes_aggregate存储每个 resource_id 的点赞数

在此处输入图像描述

在此处输入图像描述

我的 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 个为一组进行分页?

标签: postgresqlpaginationkeyset-pagination

解决方案


有两个选项可以满足您的需要:

OFFSET n FETCH FIRST n ROWS ONLYsort_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;

这将确保您跳过前一页中的行,但是这种策略的缺点是您无法再次返回页面。


推荐阅读