2012-03-14 71 views
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之间的循环(3分到4,4分到3而不是5)

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

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

我该怎么做?

+0

你打算得到一个单一的答复,而不是组? – 2012-03-14 04:32:53

+0

正确,我试图在当前正在查看的人之后获得下一个“热门”帖子。 – Bill 2012-03-17 02:22:05

+0

对于所有想知道的人,我最终创建了一个单独的排名表,它每4小时更新一次cron,并使用生成的排名#作为转到上一张到下一张图片的手段。由于我在SQL方面的经验不足,我之前参与的单个查询可能会涉及太多的subquerys。我的查询是mattedgod和newtovers解决方案的混合,但花了大约2-3秒来执行,这是不可接受的。 – Bill 2012-03-27 14:50:10

回答

0

限制使用范围内,例如

limit 0,1 

其中零是起始记录和一个是记录获取数。

limit 5,1 

会给你第六条记录等等。您可以通过发布,获取或会话跟踪页码,并使用它来以这种方式操纵查询。

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

+0

这将工作,但我正在使用的系统表单提交所请求的系统,我不能使用GET参数在这个项目上,因为URL必须是'干净',并且不被屏蔽。 – Bill 2012-03-17 02:24:02

1

您需要的第一步是对结果进行“排序”。我发现这样做在MySQL的最好办法是,像这样的变量:

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

那么你很可能不得不窝在另一个查询来完成你所需要的。让我知道如果这点你在正确的方向

+0

我唯一想避免的是为每个论坛视图排列整个表格,但我正在尝试在有限数量的帖子上进行排名,这些帖子直接位于当前选定排名的上方(以回复数量计)。即如果我正在查看包含10条回复的帖子,我会查看所有包含三个或更多回复的帖子,然后对那些回避当前所选帖子的帖子进行排名。我会及时向大家发布! – Bill 2012-03-17 02:33:05

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 ; 
+0

这与我之前尝试的类似;唯一的问题是,它也会通过ID对它进行排序,但ID为2的帖子可能比ID为30的帖子更受欢迎(更多回复);在这种情况下,如果我正在查看带有ID 3的帖子,并且它有10个回复,并且我单击了“下一个”,则只会发送ID高于当前ID的帖子。我可以尝试混合这个mattedgod的解决方案,看看我能不能拿出任何东西,我会让你张贴! – Bill 2012-03-17 02:28:09