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

Posted

技术标签:

【中文标题】如何在排名查询中实现分页?【英文标题】:How to implement paging in ranking query? 【发布时间】:2014-03-05 06:18:32 【问题描述】:

我正在尝试使用 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,但它失败了(排名没有继续,所以它再次从一个开始)。

我不能只用限制的多个页面,因为有可能多次获得分数。

如何通过查询实现分页?

【问题讨论】:

【参考方案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 等。可能不是最好的方法,但这是一种方法:)

【讨论】:

Doh ...我想得太复杂了,但我们会看看是否有“更好”的方法。 :) 有趣,目前还没有其他答案。所以看来你的方式是“最好的”。 :)【参考方案2】:

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

我在表中添加了一个新列 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

现在,很容易限制结果。

【讨论】:

以上是关于如何在排名查询中实现分页?的主要内容,如果未能解决你的问题,请参考以下文章

java中数据库中实现分页的sql语句要求每页十条要查询的是第二页

用Servlet与JSP中实现分页查询

使用插件pagehelper在mybatis中实现分页查询

如何在 SQL for MS Access 中实现分页?

如何在 SQL for MS Access 中实现分页?

Yii中实现分页