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

标签 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的图片显示在不同的页面上。我猜原因是排序,但无法构造任何更好的查询,这将不允许重复。有人可以给我提示吗?

提前致谢!

最佳答案

是否每页执行一个查询来显示?如果是,我怀疑数据库不能保证具有相同票数的项目的一致顺序。因此,如果两个项目具有相同的票数,第一个查询可能会返回 { 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/

相关文章:

php - 我的代码只向我显示第一个结果并带来另一个空值

php - 具有多个 where 的 Joomla 查询

SQL 2005 - 查询查找行数最多的表

php - 查询通过 phpmyadmin 执行,但不通过 php 脚本执行

C# SQL 命令变量与文字

mysql - 如何根据 SQL 中的条件选择组中的一行?

sql - 如何在2个表之间建立一对多关系

SQL Server : Multiple rows XML

mysql - 如何从 MySQL 表中获取与其他两个表不匹配的结果

mysql - 如何选择在项目上工作时间最长的员工