我正在获取 API 中添加分页,并且需要从选择查询中获取特定的行号。我怎样才能在 postgresql 中实现这一点? 就像 page=2 和 count=10 一样,我想检索第 11-20 行。
select users.id from users, usernotification where usernotification.channel=1 and usernotification.id=users.id;
答案 0 :(得分:0)
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。由于 db<>fiddle 不支持分页,它将使用先验知识页面控制值“向前翻页”。还添加了几个额外的列。