Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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_Pagination - Fatal编程技术网

Mysql 如何在排名查询中实现分页?

Mysql 如何在排名查询中实现分页?,mysql,pagination,Mysql,Pagination,我正在尝试用MySQL实现排名。我发现了一篇关于它的好文章,没有使用自连接() 关于这一点,我将有很多排名,最好添加分页功能。 第一个想法是使用LIMIT,但它失败了(排名没有继续,所以它又以一开始) 我不能用这个限制来翻倍页面,因为它有可能多次得分 如何使用查询实现分页?您可以通过添加外部查询来实现类似于LIMIT的分页,如下所示: SELECT score_id, student_name, score, rank FROM (SELECT score_id, student_nam

我正在尝试用MySQL实现排名。我发现了一篇关于它的好文章,没有使用自连接()

关于这一点,我将有很多排名,最好添加分页功能。
第一个想法是使用
LIMIT
,但它失败了(排名没有继续,所以它又以一开始)

我不能用这个限制来翻倍页面,因为它有可能多次得分


如何使用查询实现分页?

您可以通过添加外部查询来实现类似于LIMIT的分页,如下所示:

SELECT score_id, student_name, score, rank
FROM 
(SELECT
   score_id, student_name, score,
   @prev := @curr,
   @curr := score,
   @rank := IF(@prev = @curr, @rank, @rank+1) AS rank
 FROM
   score,
   (SELECT @curr := null, @prev := null, @rank := 0) sel1
 ORDER BY score DESC) AS b
WHERE rank BETWEEN 1 AND 10

然后,您可以在11到20之间执行
,等后续页面。可能不是最好的方法,但它是一种方法:)

我找到了另一种适合我的解决方案

我在表中添加了一个新的列rank,并使用
UPDATE
查询计算排名

UPDATE score s, (
        SELECT
          score_id, student_name, score,
          @prev := @curr,
          @curr := score,
          @rank := IF(@prev = @curr, @rank, @rank+1) AS rank
        FROM
          score,
          (SELECT @curr := null, @prev := null, @rank := 0) sel1
        ORDER BY score DESC
    ) r
        SET s.rank = r.rank WHERE s.score_id = r.score_id

现在,很容易限制结果。

Doh。。。我的想法太复杂了,但我们会看看是否有“更好”的方法有趣的是,目前还没有其他答案。看来你的方式是“最好的”。)
UPDATE score s, (
        SELECT
          score_id, student_name, score,
          @prev := @curr,
          @curr := score,
          @rank := IF(@prev = @curr, @rank, @rank+1) AS rank
        FROM
          score,
          (SELECT @curr := null, @prev := null, @rank := 0) sel1
        ORDER BY score DESC
    ) r
        SET s.rank = r.rank WHERE s.score_id = r.score_id