sql - 返回页面时如何在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 < 80
,id < 70
等等,它工作得很好。但是,如果我想返回页面怎么办?
现在我这样做:(更改<
为>
和)DESC
ASC
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
...
我的问题:
- 我对这种分页方法的实现是否正确?也许我做错了什么?
- 如果我的方法是正确的,我应该如何以正确的顺序获取记录?是否可以在 SQL 中执行此操作,或者唯一的方法是事后在服务器上对结果进行排序?
解决方案
获取当前顺序的行是一个子查询,然后在外部进行:
select *
from (select *
from users
where id > 89
order by id asc
limit 10
)
order by id desc;
推荐阅读
- apache - .htaccess 文件,用于将域重定向到子文件夹
- docker - How do you identify the docker image an image was built from?
- service-worker - How to Correctly Provide swDest?
- sql - 如何在sql中提取最后一个聚合日期的值
- c# - log4net:错误 XmlHierarchyConfigurator:找不到属性 [MaximumFileSize] 以在 [log4net.Appender.RollingFileAppender] 上设置对象
- ios - TextField 电话号码或电子邮件格式验证迅速吗?
- azure - 当子项包含空数组时,Azure CosmosDB sql join 不返回结果
- c# - Entity Framework Core 同模型中的父子项,子节点返回null
- python - Python的`struct`字节大小计算
- r - 如何根据另一列的组内的最大值选择列内容。根据每个基因的最大值选择标记名称