您好,登錄后才能下訂單哦!
下面一起來了解下怎么樣成功查詢MySQL并列排名和順序排名,相信大家看完肯定會受益匪淺,文字在精不在多,希望怎么樣成功查詢MySQL并列排名和順序排名這篇短內容是你想要的。
創(chuàng)建一張叫scores的表,內容如下。因為測試排名,所以就用最簡單的結構。
id | score |
---|---|
1 | 99 |
2 | 80 |
3 | 87 |
4 | 60 |
5 | 80 |
6 | 99 |
獲取分數(shù)排名,要求并列排名。如果兩個分數(shù)相同,則兩個分數(shù)排名(rank)相同。名次之間不應該有“間隔”。
id | score | rank |
---|---|---|
1 | 99 | 1 |
6 | 99 | 1 |
3 | 87 | 2 |
2 | 80 | 3 |
5 | 80 | 3 |
4 | 60 | 4 |
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。結果如下:
我們發(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;
順序排名我們就按照score字段倒序查詢即可,只不過是用msyql的變量去做rank。mysql中的變量是用‘@’跟上變量名稱。@rowNum php中我們用$rowNum。mysql中賦值用 := 來賦值。(select @rowNum :=0) r 是給變量@rowNum一個初始值為0。這個很好理解。就是 按照我們要排名的字段倒序去查詢,再用mysql變量給每一條結果加一個排列序號。
select t.id, t.score,@rowNum := @rowNum +1 as rank from (select @rowNum :=0) r, scores as t order by t.score desc ;
看完怎么樣成功查詢MySQL并列排名和順序排名這篇文章后,很多讀者朋友肯定會想要了解更多的相關內容,如需獲取更多的行業(yè)信息,可以關注我們的行業(yè)資訊欄目。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。