8

我在 postgres 中有以下查询:

SELECT * 
FROM "bookings"
WHERE ("bookings".client_id = 50) 
ORDER BY session_time DESC 
LIMIT 20 OFFSET 0

第 20 位的记录与第 21 条记录具有相同的 session_time。

此查询返回 20 个结果,但是如果将结果与整个数据库进行比较,则查询返回第 1-19 个结果和第 21 个结果,跳过第 20 个结果。

可以通过在订单中添加“id”来修复此查询:

SELECT * 
FROM "bookings" 
WHERE ("bookings".client_id = 50) 
ORDER BY session_time DESC, id 
LIMIT 20 OFFSET 0

但是我想知道这个错误是如何发生的?使用偏移量和限制时,postgres 如何对相同的文件进行排序?是随机的吗?这是postgres的错误吗?

4

1 回答 1

10

这不是错误。限制和偏移发生在排序之后,并且在一种情况下选择哪些行与另一种情况下并不确定。一般来说,您希望有一个 tiebreaker,以便您的排序是稳定和确定的(即使我没有限制或偏移问题,我更喜欢使用唯一的 tiebreakers,以确保每次运行时查询都是相同的)。

如果您正在进行分页,请将主键或代理键添加到排序中作为决胜局。这真的是最好的办法。

于 2013-04-06T16:09:13.883 回答