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

时间:2014-02-07 17:49:36

标签: mysql pagination

我正在尝试使用MySQL实现排名。我没有使用自联接(ranking without self join)找到了一篇关于它的好文章。

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

关于我将有很多排名,添加分页会很不错 第一个想法是使用LIMIT,但它失败了(排名没有继续,所以它再次从一个开始)。

我不能仅限制具有限制的页面,因为可以多次获得分数。

如何使用查询实现分页?

2 个答案:

答案 0 :(得分:1)

您可以通过添加外部查询来完成类似于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

然后你可以为后续页面做BETWEEN 11 AND 20等。可能不是最好的方法,但这是一种方式:)

答案 1 :(得分:0)

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

我在表格中添加了一个新列排名,并使用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

现在,很容易限制结果。