MySQL查询:使用非唯一值排序列表时获取下一个或上一个项目

Sil*_*ght 1 php mysql

我有图像库.每张图片的评级都取决于有多少用户投票"我喜欢这个".MySQL表就是这样的:

id       |image      |rating
------------------------------------
166      |6.png      |9
165      |8.png      |9
189      |1.png      |8
171      |99.png     |8
169      |56.png     |8
155      |34.png     |8
265      |7.png      |7
754      |86.png     |6
166      |37.png     |4
342      |95.png     |2
99       |35.png     |0
76       |34.png     |0
44       |3.png      |0
8        |22.png     |0
Run Code Online (Sandbox Code Playgroud)

任务是:可以查看按评级排序的图库.使用列表图像很容易,ORDER BY rating DESC, id DESC但是当用户点击图像时出现问题,我必须在打开的图像旁边显示"上一张图像"和"下一张图像"按钮.

假设我们现在正在查看示例表中id = 169的图像:

id       |image      |rating
------------------------------------
169      |99.png     |8
Run Code Online (Sandbox Code Playgroud)

如何编写查询,以获取上一张图像(id = 171)?问题是,主要排序是rating(不是唯一的),次要是唯一的id.在任何情况下哪个查询都会给我正确的上一张图像.

我试过了:

SELECT *
FROM images
WHERE rating >= 8 AND id >=169
ORDER BY rating, id
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

但它没有,因为id >=169只有在评级相同时才必须检查.

我有点困惑,请帮帮我.

UPDATE

我自己想出这个.假设我有当前记录的ratingid值,获取先前记录的查询将是:

SELECT *
FROM `images`
WHERE 
    (`rating` = 8 AND `id` > 169)
    OR `rating` > 8
ORDER BY `rating`, `id`
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

如果rating = 8 AND id > 169没有评估,那么rating > 8进入游戏.结果很简单.

谢谢大家!用大多数赞成票来接受答案.

sfu*_*ger 5

SELECT * FROM images ORDER BY rating DESC, id LIMIT $n, 1
Run Code Online (Sandbox Code Playgroud)

其中$n是从0开始的计数器.按ID排序可确保后续调用始终保持相同的顺序.因此,下一个图像将是$n+1先前的$n-1.

此外,如果要确保当前的图像有下一个图像(用户当然不喜欢单击"下一步"以获得404错误),您总是可以获取2个图像.

编辑:评论的新要求

嗯,你可以尝试计算你当前图像的最小距离.

SELECT * from images
WHERE id < $current[id] AND rating >= $current[rating] 
ORDER by ((abs($current[rating] - rating) << 32) + abs($current[id] - id))
LIMIT 1

SELECT * from images
WHERE id > $current[id] AND rating <= $current[rating]
ORDER by ((abs($current[rating] - rating) << 32) + abs($current[id] - id))
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

不要问我任何关于表现的事情;)