表:
數據:
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就執行了。