mysql考试成绩排名-关于@rowtotal、@rownum

表:

 数据:

 1. 用户可以多次考试,以最新的为准

SELECT
    t.* 
FROM
    ( SELECT * FROM t_demo ORDER BY begin_time DESC ) t 
GROUP BY
    t.user_id 
ORDER BY
    t.score DESC 

结果:

 2. 排名:分数一样的排名一样

SELECT
    obj.user_id,
    obj.score,
    obj.begin_time,
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
    t.* 
FROM
    ( SELECT * FROM t_demo ORDER BY begin_time DESC ) t 
GROUP BY
    t.user_id 
ORDER BY
    t.score DESC 
    ) AS obj,
    ( SELECT @rownum := 0, @rowtotal := NULL ) r

解析:

 @rownum初始值为0,@rowtotal初始值为null:@rowtotal :是复制的意思

第一次

第一个WHEN,不会执行

WHEN @rowtotal = obj.score THEN
@rownum

第二个WHEN,赋值后发现@rowtotal为100,100为true,将执行

@rownum为1

第三个WHEN,只有当第二个WHEN赋值后变为0,第二个WHEN不会执行,将执行第三个,即第一次遇到0执行

下一次遇到0,将在第一个WHEN就执行了。

猜你喜欢

转载自www.cnblogs.com/bloodthirsty/p/12371808.html
今日推荐