我有图像库.每张图片的评级都取决于有多少用户投票"我喜欢这个".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
我自己想出这个.假设我有当前记录的rating和id值,获取先前记录的查询将是:
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进入游戏.结果很简单.
谢谢大家!用大多数赞成票来接受答案.
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)
不要问我任何关于表现的事情;)