Mysql 根据排名和以前选择的行选择行
我正在尝试做一个论坛排名系统,它可以得到一个记录在一个时间的基础上以前的记录 示例表为: | POST_ID | POST_REPLIES | -------------------------- | 1 | 5 | | 2 | 2 | | 3 | 8 | | 4 | 8 | | 5 | 12 | --------------------------Mysql 根据排名和以前选择的行选择行,mysql,ranking,Mysql,Ranking,我正在尝试做一个论坛排名系统,它可以得到一个记录在一个时间的基础上以前的记录 示例表为: | POST_ID | POST_REPLIES | -------------------------- | 1 | 5 | | 2 | 2 | | 3 | 8 | | 4 | 8 | | 5 | 12 | --------------
我如何做到这一点?例如,使用范围进行限制
limit 0,1
其中0是起始记录,1是要获取的记录数
limit 5,1
会给你第六张唱片等等。您可以通过post、get或会话跟踪页码,并使用它以这种方式操作查询
获取和存储所有记录,然后每页显示它们也是很常见的,但是如果您希望生成大量记录,这可能会有问题 您需要的第一步是对结果进行“排序”。我发现在MySQL中实现这一点的最好方法是使用如下变量:
SELECT posts.post_id, posts.post_replies, @rank := @rank + 1 AS rank
FROM posts, (SELECT @rank := 0) r
然后,您可能必须将该查询嵌套在另一个查询中才能完成所需的操作。让我知道这是否为你指明了正确的方向你是否打算得到一个单独的回复而不是群回复?正确,我正试图在当前查看的帖子之后获得下一个“热门”帖子。对于所有想知道的人,我最终创建了一个单独的排名表,由cron每4小时更新一次,并使用生成的排名作为转到上一张到下一张图片的方式。我以前使用的单个查询涉及的子查询太多,可能是因为我使用SQL的经验太少。我的查询是mattedgod和newtovers解决方案的混合,但执行起来需要2-3秒,这是不可接受的。这可以工作,但我使用的系统是表单提交请求的,我不能在这个项目上使用GET参数,因为url必须是“干净”和未屏蔽的。这与我以前尝试的类似;唯一的问题是它也会根据ID对其进行排序,但是ID为2的帖子可能比ID为30的帖子更受欢迎(回复更多);在这种情况下,如果我正在查看带有ID 3的帖子,它有10个回复,并且我单击了“下一步”,那么它只会转到ID高于当前ID的帖子。我可能会尝试混合这个mattedgod的解决方案,看看我能想出什么,我会让你知道的!我唯一想避免的是为每个论坛视图对整个表进行排名,但我正在尝试对数量有限的帖子进行排名,这些帖子直接位于当前选定帖子的上方(就回复数量而言)。i、 e.如果我正在查看一篇有10条回复的帖子,我会查看所有有3条或更多回复的帖子,然后对那些避开当前所选帖子的帖子进行排名。我会随时通知你的!
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 ;
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 ;