Min*_*ure 8 sql postgresql sql-order-by limit offset
我在postgres中有以下查询:
SELECT *
FROM "bookings"
WHERE ("bookings".client_id = 50)
ORDER BY session_time DESC
LIMIT 20 OFFSET 0
Run Code Online (Sandbox Code Playgroud)
第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
Run Code Online (Sandbox Code Playgroud)
但是我想知道这个错误是怎么发生的?在使用抵消和限额时,postgres如何订购相同的字段?是随机的吗?这是postgres的错误吗?
这不是一个错误.排序后发生限制和偏移,并且在一种情况下选择哪一行与另一种情况不确定.一般来说,你想要一个决胜局,以便你的订购稳定和确定(我更喜欢使用独特的tiebreakers,即使我没有限制或偏移问题,以确保每次运行时查询是相同的).
如果您正在进行分页,请将主键或代理键添加到排序中作为决胜局.这真是最好的方式.