2

postgres の順序付けされた結果が一貫して順序付けされないという問題が発生しています。複数のフィールドで注文しています: ORDER BY category.position ASC、photos.display_priority

サイトをブラウズすると、結果がページ分割されるため、これに気付きました。1ページから2ページに行ったところ、1ページの下の方にあった写真が2ページの一番上にあるケースを見つけました。

これが私のページ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;

そして私のページ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;

両方のページを一度に取得して (オフセット 0、制限 50)、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 50 OFFSET 0;

クエリに何か問題がありますか? 私が理解していない制限と順序のある操作の順序はありますか?

4

1 に答える 1