2010-01-16 2 views
7

Ich entwickle eine Online - Galerie mit Voting und habe eine separate Tabelle für Bilder und Stimmen (für jede Stimme speichere ich die ID des Bildes und die ID des Wählers). Die Tabellen bezogen sich wie folgt: PICTURE <--(1:n, using VOTE.picture_id)-- VOTE. Ich möchte die Bildtabelle abfragen und die Ausgabe nach Stimmenzahl sortieren. Dies ist, was ich mache:Paging in SQL mit LIMIT/OFFSET führt manchmal zu Duplikaten auf verschiedenen Seiten

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 ist für verschiedene Seiten natürlich anders.

Es gibt jedoch Bilder mit derselben ID, die auf den verschiedenen Seiten angezeigt werden. Ich denke, der Grund ist die Sortierung, kann aber keine bessere Abfrage erstellen, die keine Duplikate erlaubt. Kann mir jemand einen Hinweis geben?

Vielen Dank im Voraus!

Antwort

12

Führen Sie eine Abfrage pro Seite zur Anzeige aus? Wenn ja, vermute ich, dass die Datenbank keine konsistente Bestellung für Artikel mit der gleichen Anzahl von Stimmen garantiert. Daher kann die erste Abfrage { item 1, item 2 } zurückgeben, und eine zweite Abfrage kann { item 2, item 1} zurückgeben, wenn beide Elemente dieselbe Anzahl an Stimmen haben. Wenn die Artikel tatsächlich die Artikel 10 und 11 sind, dann kann derselbe Artikel auf Seite 1 und dann auf Seite 2 erscheinen.

Ich hatte einmal ein solches Problem. Wenn das auch Ihr Fall anhängen, indem eine zusätzliche Klausel, nach der Bestellung eine einheitliche Reihenfolge der Posten mit der gleichen Abstimmung Nummer zu gewährleisten, zB:

ORDER BY picture.vote, picture.ID

+0

Das half, danke! –

2

Die einfache Erklärung ist, dass Sie einige Daten hinzugefügt hatten oder einige Stimmen vorkamen, als Sie verschiedene Seiten betrachteten.

Ich bin mir sicher, wenn Sie nach ID oder creation_date sortieren würden, würde dieses Problem weggehen.

I.e. Es gibt kein Problem mit Ihrem Code

+0

Nicht wirklich. Ich habe ein Testskript erstellt, das atomar alle Seiten holt und die IDs der angezeigten Bilder ausdruckt, und die Duplikate sind immer noch da. –

0

in meinem Fall dieses Problem in den Null-Wert in der zurückzuführen ist Order By-Klausel, löste ich dies durch Hinzufügen eines anderen Unique ID-Feldes in der Reihenfolge nach Klausel zusammen mit anderen Feld.

Verwandte Themen