假设我有一个事件表,其中有(索引)列id : uuid
和created : timestamp
。
id
列是唯一的,但created
列不是唯一的。我想使用created
列按时间顺序排列表格。
类似的东西:
SELECT * FROM events WHERE created >= $<after> ORDER BY created ASC LIMIT 10
此处$<after>
是从上一个查询获取的模板参数。
现在,我可以看到两个问题:
created
不是唯一的,因此无法完全定义顺序。也许排序应为id, created
? 我应该如何在Postgres中解决这个问题?
答案 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