我正在尝试使用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
,但它失败了(排名没有继续,所以它再次从一个开始)。
我不能仅限制具有限制的页面,因为可以多次获得分数。
如何使用查询实现分页?
答案 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
现在,很容易限制结果。