Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据排名和以前选择的行选择行_Mysql_Ranking - Fatal编程技术网

Mysql 根据排名和以前选择的行选择行

Mysql 根据排名和以前选择的行选择行,mysql,ranking,Mysql,Ranking,我正在尝试做一个论坛排名系统,它可以得到一个记录在一个时间的基础上以前的记录 示例表为: | POST_ID | POST_REPLIES | -------------------------- | 1 | 5 | | 2 | 2 | | 3 | 8 | | 4 | 8 | | 5 | 12 | --------------

我正在尝试做一个论坛排名系统,它可以得到一个记录在一个时间的基础上以前的记录

示例表为:

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