我在postgres中有以下查询:
SELECT *
FROM "bookings"
WHERE ("bookings".client_id = 50)
ORDER BY session_time DESC
LIMIT 20 OFFSET 0
第20位的记录与第21记录的会话时间相同。
此查询返回20个结果,但是如果将结果与整个数据库进行比较,则查询将返回第1-19个结果,第21个结果将跳过第20个结果。
可以通过在订单中添加“id”来修复此查询:
SELECT *
FROM "bookings"
WHERE ("bookings".client_id = 50)
ORDER BY session_time DESC, id
LIMIT 20 OFFSET 0
但是我想知道这个bug是怎么发生的?在使用抵消和限额时,postgres如何订购相同的字段?是随机的吗?这是postgres的错误吗?
答案 0 :(得分:9)
这不是错误。排序后发生限制和偏移,并且在一种情况下选择哪一行与另一种情况不确定。一般来说,你想要一个决胜局,以便你的订购稳定和确定(我更喜欢使用独特的tiebreakers,即使我没有限制或偏移问题,以确保每次运行时查询是相同的)。
如果您正在进行分页,请将主键或代理键添加到排序中作为决胜局。这真是最好的方式。