在SQL中使用LIMIT/OFFSET进行分页有时会导致不同页面上出现重复
我正在开发一个带有投票的在线图库,并且有一个单独的图片和投票表(每次投票我都会存储图片ID和投票人ID)。与此相关的表格:在SQL中使用LIMIT/OFFSET进行分页有时会导致不同页面上出现重复,sql,Sql,我正在开发一个带有投票的在线图库,并且有一个单独的图片和投票表(每次投票我都会存储图片ID和投票人ID)。与此相关的表格:PICTURE简单的解释是,您在查看不同页面时添加了一些数据或进行了一些投票 我相信如果你能按ID或创建日期分类,这个问题就会消失 也就是说,您的代码没有问题是否每页执行一个查询以显示?如果是,我怀疑数据库不能保证相同票数的项目的一致顺序。因此,如果两个项目的票数相同,第一个查询可能返回{item 1,item 2},第二个查询可能返回{item 2,item 1}。如果项目
PICTURE简单的解释是,您在查看不同页面时添加了一些数据或进行了一些投票
我相信如果你能按ID或创建日期分类,这个问题就会消失
也就是说,您的代码没有问题是否每页执行一个查询以显示?如果是,我怀疑数据库不能保证相同票数的项目的一致顺序。因此,如果两个项目的票数相同,第一个查询可能返回{item 1,item 2}
,第二个查询可能返回{item 2,item 1}
。如果项目实际上是项目10和11,那么相同的项目可能会出现在第1页,然后出现在第2页
我曾经有过这样的问题。如果您也是这样,请在order by中附加一个额外的条款,以确保具有相同投票数的项目的顺序一致,例如:
ORDER BY picture.vote,picture.ID
在我的例子中,这个问题是由于ORDER BY子句中的空值造成的,我通过在ORDER BY子句中添加另一个唯一的ID字段以及其他字段来解决这个问题。不是真的。我制作了一个测试脚本,它自动获取所有页面并打印显示图片的ID,副本仍然存在
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