PostgreSQL:在特定ID之后返回有序行

时间:2014-12-30 21:16:00

标签: postgresql

情境: 我正在显示一个记录表。它最初在底部显示前500,“显示更多”,返回下一个500。

问题: 如果在初始显示和单击“显示更多”1记录之间添加,则会导致“按日期排序,偏移500,限制500”重叠1行。

我想“按日期排序,偏移到'显示最后一行的ID',限制500”

我的行ID是UUID。我对采用相同结果的替代方法持开放态度。

2 个答案:

答案 0 :(得分:1)

如果您可以按ID订购,则可以使用

进行分页
where id > $last_seen_id limit 500

但在按date排序的情况下,这不会有用。

排序稳定性!

我真的希望" date"实际上意味着"时间戳"但是,否则你的订购会不稳定,你可能会错过分页行;如果date, id真的是date,您必须按timestamp订购以获得稳定的订购,即使是where date > $last_seen_date and id > $last_seen_id limit 500 ,也应该这样做。

客户端状态

一种选择是将状态推送到客户端。让客户端记住最后看到的(日期,id)元组,并使用:

LIMIT

光标

您是否关心可扩展性?如果没有,您可以使用服务器端游标。在没有FETCH的情况下为完整查询声明游标。然后根据请求CREATE TABLE sessiondata.myuser_myrequest_blah AS SELECT ....行的行。为此,您的应用必须能够始终如一地将连接绑定到特定用户的请求,而不是重置该连接或在请求之间将其返回到池。这对您的池/框架可能不实用,但如果可以的话,这可能是最好的解决方案。

临时表

另一个可扩展性较低的选项是{{1}},然后将表分页。它保证不会改变。这避免了需要在请求之间保持一致连接的困难,但是第一次请求响应时间非常慢,对于大量用户计数或大量数据而言是完全不切实际的。

相关问题

答案 1 :(得分:1)

我认为您可以在哪里使用子查询来完成此操作。

例如假设您要通过users表进行分页,并且希望记录在给定用户之后:

SELECT *
  FROM users
  WHERE created_at > (
    SELECT created_at
      FROM users
      WHERE users.id = '00000000-1111-2222-3333-444444444444'
      LIMIT 1
  )
  ORDER BY created_at DESC limit 5;