非唯一键的Postgres分页?

时间:2018-07-04 16:37:08

标签: postgresql pagination

假设我有一个事件表,其中有(索引)列id : uuidcreated : timestamp

id列是唯一的,但created列不是唯一的。我想使用created列按时间顺序排列表格。

类似的东西:

SELECT * FROM events WHERE created >= $<after> ORDER BY created ASC LIMIT 10

此处$<after>是从上一个查询获取的模板参数。

现在,我可以看到两个问题:

  1. 由于created不是唯一的,因此无法完全定义顺序。也许排序应为id, created
  2. 每行应仅在一页上,但是使用此查询时,最后一行始终包含在下一页上。

我应该如何在Postgres中解决这个问题?

2 个答案:

答案 0 :(得分:4)

SELECT * FROM events 
  WHERE created >= $<after> and (id >= $<id> OR created > $<after>)
  ORDER BY created ASC ,id ASC LIMIT 10

这样,事件的每个时间戳值将按id排序。您可以在任何地方拆分页面。

答案 1 :(得分:0)

首先,如您所说,您应该强制执行全部订购。由于您主要关心的是created,因此您应该从此开始。 id可能是次级订购,用户无法看到的抢七决胜局,这只是确保订购是一致的。其次,您可以使用created子句返回以后的结果,而不用弄乱offset上的条件:

SELECT * FROM events ORDER BY created ASC, id ASC LIMIT 10 OFFSET <10 * page number>
-- Note that page number is zero based