我正在开发一个带有投票功能的在线画廊,并有一个单独的图片和投票表(对于每一次投票,我都会存储图片的 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的图片显示在不同的页面上。我猜原因是排序,但无法构造任何更好的查询,这将不允许重复。有人可以给我提示吗?
提前致谢!
最佳答案
是否每页执行一个查询来显示?如果是,我怀疑数据库不能保证具有相同票数的项目的一致顺序。因此,如果两个项目具有相同的票数,第一个查询可能会返回 { item 1, item 2 }
,第二个查询可能会返回 { item 2, item 1}
。如果这些项目实际上是项目 10 和 11,则相同的项目可能会出现在第 1 页上,然后出现在第 2 页上。
我曾经遇到过这样的问题。如果您也是这种情况,请在 order by 中附加一个额外的子句,以确保具有相同投票数的项目的排序一致,例如:
按图片.投票、图片.ID 排序
关于sql - 在 SQL 中使用 LIMIT/OFFSET 进行分页有时会导致不同页面上出现重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57006667/