【问题标题】:Getting n rows from resultset of select query on a postgres postgres table从 postgres postgres 表上的 select 查询结果集中获取 n 行
【发布时间】:2021-06-19 18:34:08
【问题描述】:
我在获取 API 中添加分页,并且需要从选择查询中获取特定的行号。如何在 postgresql 中实现这一点?
与 page=2 和 count=10 一样,我想检索第 11-20 行。
select users.id from users, usernotification where usernotification.channel=1 and usernotification.id=users.id;
【问题讨论】:
标签:
sql
postgresql
pagination
get
【解决方案1】:
Postgres 没有行号的固有概念。可以创建真正的行号,但除非您存储它们,否则它将基于逐个查询。也就是说,以下要求仅跟踪要显示的页码。它还具有处理向前和向后滚动的优势。
注意:我已修改您的查询以使用标准 ANSI 连接语法。你应该采用它。更容易看到实际需要的内容并且不易出错。
select u.id
from users u
join usernotification un
on un.id = u.id and un.channel=1
order by u.id
offset (&page_num-1) * 10 limit 10;
如果其他用户删除以前显示的行,则可能会出现“丢失”行的缺点。如果是这样,您将“错过”等于删除的行数的后续行数。例如,在显示第 1-10 行时,另一个用户删除了其中的 5 行,您的页面 2 将显示原始的第 15-24 行,而不是 11-20。
见Demo。由于 dbfiddle 不支持分页,因此它将使用先验知识页面控制值“分页”。还添加了几个额外的列。