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就執行了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM