標籤:
通常在使用MySQL時,會碰到根據多個排名條件計算一組資料的排名情況,條件相同的則排名一致。
假設有表table,兩個條件欄位conditionA降序排序和conditionB升序排序,條件相同排名一致,排名資訊儲存在dense_rank欄位。
做法:定義@conditionA, @conditionB, @dense_rank, @id_rank四個使用者變數。其中@conditionA, @conditionB用來儲存當前一行的資料條件, @dense_rank用來儲存當前的排名值,@id_rank用來儲存序號,查詢結果按照order by conditionA desc, conditionB asc寫,則最終寫法如下,主要使用了case end。
SELECT
CASE
WHEN @conditionA =-1 AND @conditionB = -1 THEN @dense_rank := 1 #判斷是否第一個記錄,是則排名為第一
WHEN @conditionA = conditionA AND @conditionB = conditionB THEN @dense_rank #判斷目前記錄是否與之前的一樣,是則保持排名不變
ELSE @dense_rank := @dense_rank + 1 #其他情況,排名加1
END AS dense_rank,
@id_rank := @id_rank+1 AS i_rank, #遞增序號欄位
@conditionA := conditionA AS conditionA, #更新條件變數為目前記錄的值
@conditionB := conditionB AS conditionB #更新條件變數為目前記錄的值
FROM
(SELECT @id_rank:=0) i_rank, #初始化序號變數
(SELECT @dense_rank:=0) d, #初始化排名變數
(SELECT @conditionA:=-1) s, #初始化條件變數
(SELECT @conditionB:=-1) c, #初始化條件變數
table
order by conditionA desc, conditionB asc
MySQL排名SQL語句寫法