自然排名
实现结果:1,2,3,4,5;
思路实现:
设置名次自增变量,每次加1;
SELECT
obj.user_id,
obj.score,
@rownum := @rownum + 1 AS rownum
FROM
( SELECT user_id, score FROM `sql_rank` ORDER BY score DESC ) AS obj,
( SELECT @rownum := 0 ) r
同分同名逐次排名
实现结果:1,2,2,3,3;
思路实现:
设置两个变量,一个记录上一条记录的分数,一个记录名次;
与上一条记录的分数不同,名次自增;
SELECT
obj.user_id,
obj.score,
CASE
WHEN @rowtotal = obj.score THEN
@rownum
WHEN @rowtotal := obj.score THEN
@rownum := @rownum + 1
WHEN @rowtotal = 0 THEN
@rownum := @rownum + 1
END AS rownum
FROM
( SELECT user_id, score FROM `sql_rank` ORDER BY score DESC ) AS obj,
( SELECT @rownum := 0, @rowtotal := NULL ) r
同分同名自然排名
实现结果:1,2,2,4,4;
思路实现:
设置三个变量,一个记录上一条记录的分数,一个记录名次,一个记录自然名次;
自然名次每次递增;
与上一条记录的分数相同,名次自增,不同则取值自然名次;
SELECT
obj.user_id,
obj.score,
@rownum := @rownum + 1 AS num_tmp,
@incrnum :=
CASE
WHEN @rowtotal = obj.score THEN
@incrnum
WHEN @rowtotal := obj.score THEN
@rownum
END AS rownum
FROM
( SELECT user_id, score FROM `sql_rank` ORDER BY score DESC ) AS obj,
( SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0 ) r