分页需求:共100页,每页50条数据,页号从 1 开始。
PostgreSQL 数据库分页主要有三种策略:
- offset + limit
- WITH HOLD cursors
- keyset
第一种方法
SELECT value, created
FROM data
WHERE value BETWEEN 0 AND 10
ORDER BY created
OFFSET 4950 LIMIT 50;
计算公式:offset = (page - 1) * pageSize
第二种方法
先声明游标:
START TRANSACTION;
/*
* Don't use SCROLL unless you need to scroll backwards,
* for example to get the total count (see below).
*/
DECLARE c SCROLL CURSOR WITH HOLD FOR
SELECT value, created
FROM data
WHERE value BETWEEN 0 AND 10
ORDER BY created;
/* this will calculate the whole result set */
COMMIT;
然后
/* get page number 100 */
MOVE ABSOLUTE 4950 IN c;
FETCH 50 FROM c;
最后
第三种方法
思路是记录下上一次最后一个记录的 id 值,显然下一页的 id 值都会大于这个 id 值
SELECT id, value, created
FROM data
WHERE value BETWEEN 0 AND 10
AND (created, id) > ('2022-01-01 01:27:35+01', 5256)
ORDER BY created, id
LIMIT 50;

参考文章
https://www.cybertec-postgresql.com/en/pagination-problem-total-result-count/
分页需求:共100页,每页50条数据,页号从 1 开始。
PostgreSQL 数据库分页主要有三种策略:
第一种方法
计算公式:
offset = (page - 1) * pageSize第二种方法
先声明游标:
然后
最后
第三种方法
思路是记录下上一次最后一个记录的 id 值,显然下一页的 id 值都会大于这个 id 值
参考文章
https://www.cybertec-postgresql.com/en/pagination-problem-total-result-count/