溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么樣成功查詢MySQL并列排名和順序排名

發(fā)布時間:2020-05-27 10:26:08 來源:PHP中文網 閱讀:402 作者:三月 欄目:MySQL數(shù)據(jù)庫

下面一起來了解下怎么樣成功查詢MySQL并列排名和順序排名,相信大家看完肯定會受益匪淺,文字在精不在多,希望怎么樣成功查詢MySQL并列排名和順序排名這篇短內容是你想要的。                                                           怎么樣成功查詢MySQL并列排名和順序排名

準備。

創(chuàng)建一張叫scores的表,內容如下。因為測試排名,所以就用最簡單的結構。
idscore
199
280
387
460
580
699

需求。

獲取分數(shù)排名,要求并列排名。如果兩個分數(shù)相同,則兩個分數(shù)排名(rank)相同。名次之間不應該有“間隔”。

結果如下。

idscorerank
1991
6991
3872
2803
5803
4604

sql語句

select id, score, (select count(distinct(score)) from scores as b where b.score > a.score ) + 1 as rank from scores as a order by rank;
先把結果拿出來,然后再分析怎么思考這個問題。這里的查詢關鍵字我都沒有大寫,個人習慣!應該是要大寫的。

分析。

按照上面的需求,我們可以知道我們是要做一個按照分數(shù)(score)查詢的一個功能,只不過是要給排序好的結果加上一個我們想要的名次。
我們笨想,我們要想知道某個分數(shù)排第幾名,是不是知道有幾個比它大就行了。如果有零個比它大的,那么它就是第一名,如果只有一個比它大,
那么它就是第二名。以此類推就好了。
那么我們來分析上面的sql語句。它就是把socres表分成了倆個一樣的表,a 表,b表。然后通過子查詢去查rank的值。
第一步:select id,score, rank from scores order by rank;我們查詢我們要的信息,但是我們scores表中沒有rank這個字段,所以就要分成倆個一
       樣的表,做子查詢,來查rank。
第二步:select id,score,(select count(score) from scores as b where b.score > a.score) + 1 as rank from scores as a order by rank;上面說過了
       如果0個比某分數(shù)大,那么它就是第一名。所以我們要再查詢的個數(shù)上加1。結果如下:

怎么樣成功查詢MySQL并列排名和順序排名

我們發(fā)現(xiàn)結果不是我們預期的。因為我們還沒有去重。比87大的有倆個都是99,那么87的rank就是2+1=3,而我們要的排名連續(xù)不斷的。所以用distinct
關鍵字去重。
第三步:select id, score, (select count(distinct(score)) from scores as b where b.score > a.score ) + 1 as rank from scores as a order by rank;

怎么樣成功查詢MySQL并列排名和順序排名

順序排名預期結果

怎么樣成功查詢MySQL并列排名和順序排名

順序排名我們就按照score字段倒序查詢即可,只不過是用msyql的變量去做rank。mysql中的變量是用‘@’跟上變量名稱。@rowNum 
php中我們用$rowNum。mysql中賦值用 := 來賦值。(select @rowNum :=0) r 是給變量@rowNum一個初始值為0。這個很好理解。就是
按照我們要排名的字段倒序去查詢,再用mysql變量給每一條結果加一個排列序號。

sql語句

select t.id, t.score,@rowNum := @rowNum +1 as rank from (select @rowNum :=0) r, scores as t order by t.score desc ;

結果

怎么樣成功查詢MySQL并列排名和順序排名

看完怎么樣成功查詢MySQL并列排名和順序排名這篇文章后,很多讀者朋友肯定會想要了解更多的相關內容,如需獲取更多的行業(yè)信息,可以關注我們的行業(yè)資訊欄目。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI