You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keyset分页查询尾页、上一页及单查询获取总记录数问题咨询

1. 最后一页记录查询方法

Keyset分页查询最后一页无需提前计算总条数和偏移量,直接通过倒序排序+限制条数后再正序即可,以每页2条数据为例,示例SQL如下:

SELECT * FROM (
  SELECT t.id AS id, t.date AS record_date, t.description AS description
  FROM test t 
  ORDER BY t.id DESC 
  LIMIT 2
) AS reverse_page
ORDER BY id ASC;

如果已经提前统计过总记录数,也可以通过偏移量实现,但上述倒序方案性能更高,尤其适合数据量较大的场景。

2. 上一页记录查询方法

需要提前缓存当前页第一条记录的id值,假设当前页第一条记录的id为current_first_id,查询时先倒序过滤+取页大小条数,再正序恢复排序即可,示例SQL如下:

SELECT * FROM (
  SELECT t.id AS id, t.date AS record_date, t.description AS description
  FROM test t 
  WHERE t.id < current_first_id
  ORDER BY t.id DESC 
  LIMIT 2
) AS prev_page
ORDER BY id ASC;

如果查询后返回的结果为空,说明当前已经是第一页,上一页按钮可以置灰禁用。

3. 首页记录查询方法

无需额外过滤条件,直接正序排序+限制页大小即可,和你给出的SQL NO.1逻辑一致,示例SQL如下:

SELECT t.id AS id, t.date AS record_date, t.description AS description
FROM test t 
ORDER BY t.id 
LIMIT 2;

4. 单条查询同时获取三类数据的可行性

是可以实现的,对于支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等),可以通过COUNT(*) OVER()语法直接在查询结果中附加总记录数,当前页记录数可以通过结果集长度直接获取,也可以通过窗口函数返回,示例SQL如下:

SELECT 
  t.id AS id, 
  t.date AS record_date, 
  t.description AS description,
  COUNT(*) OVER () AS total_count, -- 符合条件的总记录数
  COUNT(*) OVER (PARTITION BY 1) AS page_record_count -- 当前页记录数
FROM test t 
WHERE t.id > 3 -- 分页过滤条件,首页可去掉
ORDER BY t.id 
LIMIT 2;

如果是不支持窗口函数的低版本数据库,也可以通过子查询嵌套统计总条数,或者用UNION拼接总计数的方式实现,只是写法相对繁琐。


内容的提问来源于stack exchange,提问作者miroana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:15:05