5

在尝试在 postgres 中从服务器端实现分页时,我遇到了一个问题,即在使用限制和偏移关键字时,您必须在可能是主键的唯一列上提供 ORDER BY 子句。

在我的情况下,我使用 Pkeys 的 UUID 生成,所以我不能依赖增加键的顺序。ORDER BY pkey DESC - 可能不会总是在顶部产生更新的行。所以我求助于使用创建日期列 - 应该是唯一的时间戳列。

但我的问题是,如果 UI 客户端想要按其他列排序怎么办?如果它可能并不总是一个唯一的列,我会使用 ORDER BY user_column, created_dt DESC 以保持 postgres 分页的可预测结果。

这是正确的方法吗?我不确定我是否走对了路。请指教。

4

2 回答 2

5

我在一篇旧博客文章中谈到了这个确切的问题(在使用 ORM 的情况下):

最后一点关于结合使用排序和分页。如果 ORDER BY 子句不包含表示数据中经验序列的字段,则实现分页的查询可能会产生奇怪的结果;在大多数(可能是所有)数据库引擎中,排序顺序不能保证超出 ORDER BY 子句中明确指定的顺序。举个例子:如果你有 100 个订单都发生在完全相同的日期,并且你要求按该日期排序的第一页数据,然后要求以相同方式排序的第二页数据,完全有可能你会得到一些在两个页面上重复的数据。因此,根据查询和“可排序”的数据分布,

http://psandler.wordpress.com/2009/11/20/dynamic-search-objects-part-5sorting/

于 2013-08-13T01:40:51.683 回答
2

在某些情况下,使用将记录唯一标识为 pkey 或插入日期的列的策略可能是不可能的。

我有一个应用程序,用户可以在其中设置自己的网格查询,然后它可以简单地放置多个表中的任何列,也许没有一个是唯一标识符。

在可能有用的情况下,您可以使用 rownum。您只需选择 rownum 并使用他的排序功能。它会是这样的:

select col1, col2, col3, row_number() over(order by col3) from tableX order by col3

重要的是 over(order by *) 与 order by * 匹配。因此,您的分页每次都会有一致的结果。

于 2015-03-17T15:27:24.953 回答