如何在排名查询中实现分页?
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
现在,很容易限制结果。
【讨论】:
以上是关于如何在排名查询中实现分页?的主要内容,如果未能解决你的问题,请参考以下文章