首页 > 解决方案 > 返回页面时如何在SQL中使用搜索分页?(Postgres)

问题描述

我想用 seek 方法(通过使用索引)创建一个分页。在第一页上,我想拥有最新的记录(具有最高 id),所以当我转到下一页时,id 应该越来越低。

假设我在数据库中有 100 个用户。所以我第一个获取第一页的查询是这样的:

SELECT * FROM users ORDER BY id DESC LIMIT 10

要获取另一个页面,我需要使用索引:

SELECT * FROM users WHERE id < 90 ORDER BY id DESC LIMIT 10

如果我想获取下一页,我只是这样做id < 80id < 70等等,它工作得很好。但是,如果我想返回页面怎么办?

现在我这样做:(更改<>和)DESCASC

SELECT * FROM users WHERE id > 89 ORDER BY id ASC LIMIT 10

这会获取所需的记录,但问题是它们的排序反之亦然。

我得到什么:

90 | tom@gmail.com
91 | patrick@gmail.com
92 | jimmy@gmail.com
...

我想得到什么:

100 | hannah@gmail.com
99 | dog@gmail.com
98 | hello@gmail.com
...

我的问题:

  1. 我对这种分页方法的实现是否正确?也许我做错了什么?
  2. 如果我的方法是正确的,我应该如何以正确的顺序获取记录?是否可以在 SQL 中执行此操作,或者唯一的方法是事后在服务器上对结果进行排序?

标签: sqlpostgresqlpagination

解决方案


获取当前顺序的行是一个子查询,然后在外部进行:

select * 
  from (select * 
          from users 
         where id > 89 
         order by id asc 
         limit 10
       ) 
order by id desc;

推荐阅读