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

时间:2012-03-14 04:29:16

标签: mysql ranking

我正在尝试建立一个论坛排名系统,该系统可以根据之前的记录一次获得一条记录。

示例表是:

| 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之间的循环(3点到4点,4点到3点而不是5点)

我曾经玩过将表连接到自身并比较行以查看哪个更大或更小,但由于我使用的是1的限制,因此该行始终为1,因此无用。所以我的基本查询是:

SELECT * FROM posts
   WHERE post_id != '$currentPost' 
   ORDER BY POST_REPLIES DESC, POST_ID DESC LIMIT 1

我该怎么做?

3 个答案:

答案 0 :(得分:1)

您需要的第一步是“排名”结果。我在MySQL中发现这样做的最好方法是使用如下变量:

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

然后你可能不得不将该查询嵌套在另一个查询中以实现您的需要。如果这指向正确的方向,请告诉我

答案 1 :(得分: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 ;

答案 2 :(得分:0)

限制使用范围,例如

 limit 0,1

其中0是起始记录,1是要获取的记录数。

 limit 5,1

会得到第六条记录,依此类推。您可以通过post,get或session跟踪页码,并使用它以这种方式操作查询。

获取和存储所有记录,然后每页显示它们也很常见,但是如果您希望生成大量记录,则可能会出现问题。