2010-01-16 2 views
7

Je développe une galerie en ligne avec le vote et avoir une table séparée pour les photos et votes (pour chaque vote, je suis stocker l'ID de l'image et la ID de l'électeur). Les tables liées comme ceci: PICTURE <--(1:n, using VOTE.picture_id)-- VOTE. Je voudrais interroger la table des images et trier la sortie par le nombre de votes. C'est ce que je fais:Paging dans SQL avec LIMIT/OFFSET se traduit parfois en double sur des pages différentes

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 est différent pour des pages différentes, bien sûr.

Cependant, il y a des photos avec le même ID qui sont affichés sur les différentes pages. Je suppose que la raison est le tri, mais ne peut pas construire une meilleure requête, ce qui ne permettra pas les doublons. Quelqu'un pourrait-il me donner un indice?

Merci d'avance!

Répondre

12

-vous exécutez une requête par page pour afficher? Si oui, je soupçonne que la base de données ne garantit pas une commande cohérente pour les articles ayant le même nombre de votes. Ainsi, la première requête peut renvoyer { item 1, item 2 } et une deuxième requête peut renvoyer { item 2, item 1} si les deux éléments ont le même nombre de votes. Si les éléments sont en fait les articles 10 et 11, le même élément peut apparaître à la page 1, puis à la page 2.

J'ai eu un problème une fois. Si c'est aussi votre cas, ajoutez une clause supplémentaire à l'ordre par pour assurer une commande cohérente des articles avec le même nombre de voix, par exemple:

ORDER BY picture.vote, picture.ID

+0

Cela a aidé, merci! –

2

explication est que le simples que vous aviez des données ajoutées ou des votes se sont produites lorsque vous CHERCHAIT à différentes pages.

Je suis sûr que si vous SORTE par ID ou creation_date cette question disparaîtrait.

I.e. il n'y a aucun problème avec votre code

+0

Pas vraiment. J'ai fait un script de test qui récupère atomiquement toutes les pages et imprime les ID des images affichées, et les doublons sont toujours là –

0

dans mon cas, ce problème était dû à la valeur nulle dans la La clause Order By, j'ai résolu ce problème en ajoutant un autre champ ID unique dans la clause Order By avec d'autres champs.

Questions connexes