表:
数据:
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就执行了。