在MySQL中,排序後添加序號列
因為我在刷LeetCode題目的時候,遇到了這題Rank Scores
題目的要求是對score進行降序排列後並生成序號。它要得到的結果如下:
我的思路是先將score去重後進行降序排列,然後再添加序號列,最後將新表與原表利用JOIN聯結起來。
1、去重與降序
在MYSQL中,去重要用到DISTINCT語句,而它的排序默認的是升序,我們要的是降序便需要用到DESC。代碼如下:
select distinct score from scoresorder by score desc
2、添加序號列
將上面得到的表命名為T1,對其添加序號列。在這裡有個疑惑:為什麼不在上表中直接添加序號列呢?例如將代碼寫成:
select distinct score,(@rownum:=@rownum+1) as rownumfrom scores,(select @rownum:=0) Rorder by score desc
運行結果如下:
score rownum4.00 3.04.00 5.03.85 4.03.65 2.03.65 6.03.50 1.0
這時就會發現它沒有去重,而且它的序號和原來的ID是一致的。所有說直接添加序號列不可行。因此我們對T1添加序號列,代碼如下:
select T1.score as score1,(@rownum:=@rownum+1) as rownumfrom(select distinct score from scoresorder by score desc) as T1,(select @rownum:=0) as R
其結果如下:
score1 rownum4.00 1.03.85 2.03.65 3.03.50 4.0
3、與Scores表(即原表)聯結
到這裡,只要對Scores表降序排列,再與步驟2得到的T2表聯結就可以了。代碼如下:
select score,T2.rownum as Rankfrom Scoresjoin(select T1.score as score1,(@rownum:=@rownum+1) as rownumfrom(select distinct score from scoresorder by score desc) as T1,(select @rownum:=0) as R) as T2on Scores.score=T2.score1order by Scores.score DESC
結果如下:
Score Rank4.00 1.04.00 1.03.85 2.03.65 3.03.65 3.03.50 4.0
以上。
推薦閱讀:
※MySQL基準測試
※MySQL LIMIT 詳解
※SQL執行順序
※MySQL成數據勒索新目標,開發4步自查
※寫給菜鳥和老鳥,mysql5.6、5.7如何飛速安裝
TAG:MySQL |