MySQL並列排名和順序排名查詢

2021-09-24 23:25:28 字數 2511 閱讀 6139

**:

建立一張叫scores的表,內容如下。因為測試排名,所以就用最簡單的結構。id

score199

280387

460580

699獲取分數排名,要求並列排名。如果兩個分數相同,則兩個分數排名(rank)相同。名次之間不應該有「間隔」。id

score

rank199

16991

38722

803580

34604

select id, score, (selectcount(distinct(score)) from scoresasb where b.score > a.score ) + 1asrank from scoresasa order by rank;

先把結果拿出來,然後再分析怎麼思考這個問題。這裡的查詢關鍵字我都沒有大寫,個人習慣!應該是要大寫的。

按照上面的需求,我們可以知道我們是要做乙個按照分數(score)查詢的乙個功能,只不過是要給排序好的結果加上乙個我們想要的名次。

我們笨想,我們要想知道某個分數排第幾名,是不是知道有幾個比它大就行了。如果有零個比它大的,那麼它就是第一名,如果只有乙個比它大,

那麼它就是第二名。以此類推就好了。

那麼我們來分析上面的sql語句。它就是把socres表分成了倆個一樣的表,a 表,b表。然後通過子查詢去查rank的值。

第一步:select id,score, rank from scores order by rank;我們查詢我們要的資訊,但是我們scores表中沒有rank這個字段,所以就要分成倆個一

樣的表,做子查詢,來查rank。

第二步:select id,score,(selectcount(score) from scoresasb where b.score > a.score) + 1asrank from scoresasa order by rank;上面說過了

如果0個比某分數大,那麼它就是第一名。所以我們要再查詢的個數上加1。結果如下:

我們發現結果不是我們預期的。因為我們還沒有去重。比87大的有倆個都是99,那麼87的rank就是2+1=3,而我們要的排名連續不斷的。所以用distinct

關鍵字去重。

第三步:select id, score, (selectcount(distinct(score)) from scoresasb where b.score > a.score ) + 1asrank from scoresasa order by rank;

順序排名我們就按照score欄位倒序查詢即可,只不過是用msyql的變數去做rank。mysql中的變數是用『@』跟上變數名稱。@rownum

php中我們用$rownum。mysql中賦值用 := 來賦值。(select @rownum :=0) r 是給變數@rownum乙個初始值為0。這個很好理解。就是

按照我們要排名的字段倒序去查詢,再用mysql變數給每一條結果加乙個排列序號。

允許並列的排名

時間限制 1 sec 記憶體限制 16 mb 在我們參加的各種競賽中,允許並列的排名方式是經常遇到的。例如有四名選手的成績分別為50 80 50 30分,則80分的選手為第一名,50分的兩名選手均為第二名,30分的選手為第四名。請編寫乙個程式,計算乙個選手在這種排名方式之下的名次 分數高的選手排前面...

Oracle並列排名顯示

第一種 dense rank over order by 字段 公升序或降序 as 別名 from 表名 使用別名方便之後過濾條件使用 排名的時候並列算同乙個人,如,1,2,2,3 sql select ename,job,sal,dense rank over order by sal desc ...

氣泡排序 Problem 並列排名

氣泡排序原理就是 如果有n個數,相鄰的兩個數進行比較,就是1號和2號,2號和3號 n 1號和n號比較,每次比較確定乙個數的位置。也就是第乙個輪迴比較n 1次,第二個就比較n 2次,直到只需要比較兩個數為止。核心部分就是雙重巢狀迴圈,但是從這可以看出它的時間複雜度是o n 2 複雜度很高。下面舉乙個例...