Postgres订购不一致

Kei*_*cht 1 postgresql

我有一个问题,即postgres有序的结果不是一致的.我按多个字段排序:ORDER BY categories.position ASC,photos.display_priority

我注意到这一点,因为当您浏览网站时,结果是分页的.我发现了一个从第1页到第2页的情况,在第2页的顶部,我看到了第1页底部附近的照片.

这是我的第1页查询:

SELECT "photos".*
FROM "photos"
    INNER JOIN "categories" ON "categories"."id" = "photos"."category_id"
WHERE "photos"."category_id" IN (221, 633, 377, 216, 634)
    AND (photos.caption IS NOT NULL
        AND photos.category_id IS NOT NULL
        AND photos.rights IS NOT NULL
        AND photos.deleted IS NULL)
ORDER BY categories.position ASC, photos.display_priority DESC
LIMIT 25 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)

我的第2页查询:

SELECT "photos".*
FROM "photos"
    INNER JOIN "categories" ON "categories"."id" = "photos"."category_id"
WHERE "photos"."category_id" IN (221, 633, 377, 216, 634)
    AND (photos.caption IS NOT NULL
        AND photos.category_id IS NOT NULL
        AND photos.rights IS NOT NULL
        AND photos.deleted IS NULL)
ORDER BY categories.position ASC, photos.display_priority DESC
LIMIT 25 OFFSET 25;
Run Code Online (Sandbox Code Playgroud)

当我尝试同时获取两个页面(偏移0,限制50)并检查两组之间的阈值时,没有重复,没有意外.

SELECT "photos".*
FROM "photos"
    INNER JOIN "categories" ON "categories"."id" = "photos"."category_id"
WHERE "photos"."category_id" IN (221, 633, 377, 216, 634)
    AND (photos.caption IS NOT NULL
        AND photos.category_id IS NOT NULL
        AND photos.rights IS NOT NULL
        AND photos.deleted IS NULL)
ORDER BY categories.position ASC, photos.display_priority DESC
LIMIT 50 OFFSET 0;
Run Code Online (Sandbox Code Playgroud)

我的查询有问题吗?是否有我不理解的限制和顺序的操作顺序?

cdh*_*wie 5

这听起来像categories.positionphotos.display_priority不能对所有结果行的唯一.当用于排序它们的值全部相等时,数据库服务器不指定行的顺序; 即使表格数据在查询之间没有变化,也可以按任意顺序返回它们.

要获得一致的排序,您必须添加第三个排序键,保证所有行都是唯一的,例如该特定行的标识值.