一、sql1{不管數據相同與否,排名依次排序(1,2,3,4,5,6,7.....)} 結果如下 可以看到,現在按照分數從1到9都排好序了,但是有些分數相同的用戶排名卻不一樣,這就是接下來要說的第二種sql 二、sql2{只要數據有相同的排名就一樣,排名依次排序(1,2,2,3,3,4,5..... ...
一、sql1{不管數據相同與否,排名依次排序(1,2,3,4,5,6,7.....)}
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到9都排好序了,但是有些分數相同的用戶排名卻不一樣,這就是接下來要說的第二種sql
二、sql2{只要數據有相同的排名就一樣,排名依次排序(1,2,2,3,3,4,5.....)}
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
這時候就新增加了一個變數,用於記錄上一條數據的分數了,只要當前數據分數跟上一條數據的分數比較,相同分數的排名就不變,不相同分數的排名就加一,並且更新變數的分數值為該條數據的分數,依次比較
如下圖結果:
跟第一條sql的結果相對比你會發現,分數相同的排名也相同,並且最後一名的名次由第9名變成了第7名;
如果你需要分數相同的排名也相同,但是後面的排名不能受到分數相同排名相同而不占位的影響,也就是哪怕你排名相同,你也占了這個位置(比如:1,2,2,4,5,5,7....這種形式的,雖然排名有相同,但是你占位了,後續的排名根據占位來排)
三、sql2{只要數據有相同的排名就一樣,但是相同排名也占位,排名依次排序(1,2,2,4,5,5,7.....)}
此時需呀再增加一個變數,來記錄排序的號碼(自增)
SELECT obj_new.user_id, obj_new.score, obj_new.rownum FROM ( 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 ) AS obj_new
上面sql執行的結果如下:
結果集中分數相同的,排名相同,同時它也占據了那個位置,中間的一個數據過程本人截圖了,請往下看(跟上圖做對比你就明白了):