一般在使用MySQL時,會碰到根據多個排名條件計算一組數據的排名狀況,條件相同的則排名一致。spa
假設有表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。it
SELECT io
CASEtable
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,tab
@id_rank := @id_rank+1 AS i_rank, #遞增序號字段di
@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