使用LIMIT / OFFSET在SQL中进行分页有时会导致不同页面上出现重复

时间:2010-01-16 15:21:20

标签: 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,显示在不同的页面上。我想原因是排序,但不能构造任何更好的查询,这将不允许重复。有人能给我一个暗示吗?

提前致谢!

3 个答案:

答案 0 :(得分:16)

您是否每页执行一次查询才能显示?如果是,我怀疑数据库不保证对具有相同票数的项目的合理订单。因此,如果两个项目具有相同的投票数,则第一个查询可以返回{ item 1, item 2 }并且第二个查询可以返回{ item 2, item 1}。如果项目实际上是项目10和11,则相同的项目可能出现在第1页上,然后出现在第2页上。

我曾经遇到过这样的问题。如果这也是您的情况,请在订单附加一个附加条款,以确保具有相同投票号的项目的一致排序,例如:

ORDER BY picture.vote, picture.ID

答案 1 :(得分:2)

简单的解释是,当您查看不同的页面时,您添加了一些数据或发生了一些投票。

我相信如果您按ID或creation_date排序,这个问题就会消失。

即。您的代码没有问题

答案 2 :(得分:0)

在我的情况下,这个问题是由Order By子句中的Null值引起的,我通过在Order By Clause中添加另一个唯一ID字段以及其他字段来解决这个问题。