如何在PostgreSQL中进行基于非唯一值的分页排序?

3
我该如何正确地通过对可能具有重复值的列进行排序来分页呢?我有一个名为posts的表,其中有一列包含某篇帖子的喜欢数,名为num_likes,我想按num_likes DESC排序。但下面的图片显示了我遇到的问题 - 在两个页面之间插入新行会导致重复数据被获取。 此链接解释了这个问题,并提供了keyset pagination的解决方案,但据我所见,只有当对行进行排序的列是独特/唯一时才能起作用。如果不是这种情况,我该怎么做呢? new row problem pagination
1个回答

8

通过将主键添加到排序键中,您可以轻松地使排序键唯一。

您不必向用户显示主键,只需在内部使用它来区分“相等”的行。

对于查询和索引,您可以利用PostgreSQL比较的能力,例如:(num_likes, id) >= (4, 325698)


哇,谢谢!我从来不知道这是一件事。但是如果我在创建帖子时分配自动递增的主键,并按num_likes排序,那么主键如何仍然按升序排列?我觉得它们不会。 - Michael Hsu
2
它们不必如此!如果您按num_likes,id排序,则首先按num_likes对行进行排序,仅对于相等的num_likes,才按id排序。这不会改变可见的排序顺序,但仍会使行唯一,因此您不会重复获取相同的行。 - Laurenz Albe
@LaurenzAlbe 我刚发现这篇文章,我相信它解决了我遇到的非唯一列问题。我的担忧在于性能方面,您认为添加一个预计算列与那些连接值是值得的,还是执行时间很好?我看到一些文章提到可以在where子句中动态连接,但这会使查询变得非常缓慢。我想这是因为索引不同吧?谢谢! - sebastianf182
1
@sfratini,拼接列没有任何好处,更不用说在表中冗余存储这些拼接值了。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接