LIMIT/OFFSET を使用した SQL のページングでは、異なるページで重複が発生することがあります。質問する

LIMIT/OFFSET を使用した SQL のページングでは、異なるページで重複が発生することがあります。質問する

私は投票機能付きのオンライン ギャラリーを開発しており、写真と投票用に別のテーブルを用意しています (投票ごとに写真の ID と投票者の ID を保存しています)。テーブルは次のように関連しています。PICTURE <--(1:n, using VOTE.picture_id)-- VOTE写真テーブルをクエリし、出力を投票数で並べ替えたいと思います。これを行うには、次の操作を行います。

SELECT
    picture.votes_number,
    picture.creation_date,
    picture.author_id,
    picture.author_nickname,
    picture.id,
    picture.url,
    picture.name,
    picture.width,
    picture.height,
    coalesce(anon_1."totalVotes", 0)
FROM picture
LEFT OUTER JOIN
    (SELECT
        vote.picture_id as pid,
        count(*) AS "totalVotes"
     FROM vote
     WHERE vote.device_id = <this is the query parameter> GROUP BY pid) AS anon_1
ON picture.id = anon_1.pid
ORDER BY picture.votes_number DESC
LIMIT 10
OFFSET 0

もちろん、OFFSET はページによって異なります。

しかし、異なるページに表示される同じ ID の画像があります。 理由は並べ替えにあると思いますが、重複を許可しないよりよいクエリを作成することができません。 誰かヒントをくれませんか?

前もって感謝します!

ベストアンサー1

表示するためにページごとに 1 つのクエリを実行しますか? 実行する場合、データベースは同じ投票数を持つアイテムの一貫した順序を保証していないと思われます。したがって、最初のクエリが返され{ item 1, item 2 }、両方のアイテムの投票数が同じ場合は 2 番目のクエリが返される可能性があります{ item 2, item 1}。アイテムが実際にはアイテム 10 と 11 である場合、同じアイテムがページ 1 に表示され、次にページ 2 に表示される可能性があります。

私もかつてそのような問題に遭遇しました。それがあなたの場合でもある場合は、同じ投票番号を持つ項目の一貫した順序を保証するために、order by に追加の句を追加します。例:

ORDER BY picture.vote, picture.ID

おすすめ記事