根据排名和先前选择的行选择行

3
我正在尝试创建一个论坛排名系统,该系统可以基于上一条记录每次获取一条记录。
示例表格如下: | POST_ID | POST_REPLIES | -------------------------- | 1 | 5 | | 2 | 2 | | 3 | 8 | | 4 | 8 | | 5 | 12 |
如果我执行简单的查询ORDER BY POST_REPLIES DESC,我会得到POST_ID 5, 4, 3, 1, 2
但是我的目标是只获取下一行记录(因此每次仅一行),并且基于当前所在的帖子。
例如:如果我当前正在查看第三篇帖子,则会有一个标签为“下一篇回复最多的帖子”的按钮,该按钮将指向第四篇帖子。

我目前遇到的问题是如何处理重复项,因为我在3和4之间陷入了循环(3指向4,4指向3而不是5)。
我已经尝试将表连接到自身,并比较行以查看哪个更大或更小,但由于我使用的是limit 1,所以行总是1,因此无用。 因此,我使用的基本查询是:
SELECT * FROM posts
   WHERE post_id != '$currentPost' 
   ORDER BY POST_REPLIES DESC, POST_ID DESC LIMIT 1

我该如何做到这一点?


你是打算得到一个单独的回复而不是群组的吗? - Khurram Ijaz
正确,我正在尝试获取当前查看的帖子之后的下一个“热门”帖子。 - Bill
对于所有想要了解的人,我最终创建了一个单独的排名表,每4个小时由cron更新,并使用生成的排名#作为前往上一张图片和下一张图片的手段。我之前的单个查询涉及太多子查询,可能是由于我在SQL方面的经验不足。我所拥有的查询是mattedgod和newtovers解决方案的混合体,但执行时间约为2-3秒,这是无法接受的。 - Bill
3个回答

1

你需要的第一步是对结果进行“排名”。我发现在MySQL中实现这一点的最好方式是使用变量,如下所示:

SELECT posts.post_id, posts.post_replies, @rank := @rank + 1 AS rank
FROM posts, (SELECT @rank := 0) r

那么你可能需要在另一个查询中嵌套该查询以实现你的需求。如果这能指引你朝正确的方向前进,请让我知道。


我想避免的是在每个论坛视图中对整个表进行排名,但我正在尝试对一定数量的直接位于当前选定帖子上方(按回复数计算)的帖子进行排名。例如,如果我正在查看一个有10个回复的帖子,我将查看所有具有三个或更多回复的帖子,然后对这些帖子进行排名,避免选择当前选定的帖子。我会随时向您报告! - Bill

1
SELECT p.*
FROM (
  SELECT POST_ID, POST_REPLIES
  FROM posts
  WHERE POST_ID = @currentId) as cur
JOIN posts p 
  ON p.POST_REPLIES >= cur.POST_REPLIES
  AND p.POST_ID > cur.POST_ID
ORDER BY p.POST_REPLIES DESC, p.POST_ID
LIMIT 1 ;

这与我之前尝试过的类似; 唯一的问题是它也按ID排序,但是ID为2的帖子可能比ID为30的帖子更受欢迎(回复更多); 在这种情况下,如果我正在查看ID为3的帖子,并且它有10个回复,然后我点击“下一个”,它将仅转到具有比当前ID高的ID的帖子。我可能会尝试混合此mattedgod解决方案,看看能否想出任何东西,我会及时告知您! - Bill

0

限制使用范围,例如

 limit 0,1

其中零是起始记录,一是要获取的记录数。

 limit 5,1

通过这种方式,您可以获取第六条记录等等。您可以通过post、get或session跟踪页面编号,并使用它来操作查询。

通常情况下,获取并存储所有记录,然后按页呈现它们是很常见的做法,但如果您希望生成大量记录,则可能会出现问题。


可以这样做,但是我正在使用的系统需要通过表单提交,而且在这个项目中我不能使用GET参数,因为URL必须是“干净”的和未掩盖的。 - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接