2010-01-16 12 views
7

Estoy desarrollando una galería en línea con votación y tengo una tabla separada para fotos y votos (para cada voto estoy almacenando el ID de la imagen y el ID del votante). Las tablas relacionadas de esta manera: PICTURE <--(1:n, using VOTE.picture_id)-- VOTE. Me gustaría consultar la tabla de imágenes y ordenar la salida por número de votos. Esto es lo que hago:La paginación en SQL con LIMIT/OFFSET a veces resulta en duplicados en páginas diferentes

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 es diferente para diferentes páginas, por supuesto.

Sin embargo, hay imágenes con el mismo ID que se muestran en las diferentes páginas. Supongo que la razón es la clasificación, pero no se puede construir una mejor consulta, que no permitirá duplicados. ¿Alguien podría darme una pista?

¡Gracias de antemano!

Respuesta

12

¿Ejecuta una consulta por página para visualizar? En caso afirmativo, sospecho que la base de datos no garantiza un pedido obligatorio para artículos con el mismo número de votos. Por lo tanto, la primera consulta puede devolver { item 1, item 2 } y una segunda consulta puede devolver { item 2, item 1} si ambos elementos tienen el mismo número de votos. Si los artículos son realmente los artículos 10 y 11, entonces el mismo artículo puede aparecer en la página 1 y luego en la página 2.

Tuve un problema así una vez. Si ese es también su caso, añadir una cláusula adicional para el fin de asegurar una ordenación coherente de los elementos con mismo número de votos, por ejemplo:

ORDER BY picture.vote, picture.ID

+0

Esto ayudó, ¡gracias! –

2

La explicación simple es que tenía algunos datos agregados o algunos votos ocurrieron cuando miraba en diferentes páginas.

Estoy seguro de que si sortee por ID o creation_date este problema desaparecería.

I.e. no hay problema con su código

+0

No realmente. Hice un script de prueba que atómicamente busca todas las páginas e imprime los ID de las imágenes mostradas, y los duplicados siguen ahí –

0

en mi caso este problema se debió al valor nulo en el Cláusula Order By, lo resolví agregando otro campo ID único en Order By Clause junto con otro campo.

Cuestiones relacionadas