【问题标题】: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,但它失败了(排名没有继续,所以它再次从一个开始)。

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

如何通过查询实现分页?

【问题讨论】:

    标签: mysql pagination


    【解决方案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
    

    现在,很容易限制结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 2020-07-27
      相关资源
      最近更新 更多