最近在作新版本的開發,其中涉及到排行榜的批量預生成,在此分享給你們。php
名次的計算(不考慮用遊標)測試
對於排行榜這種類型的數據,當只查一個排行榜時,因爲數據量較少,咱們能夠直接查詢後,在程序中生成名次(例如實時的只針對一個目的地下某類poi的好評榜)處理的時候php直接執行查詢語句獲取便可。code
但隨着要生成的榜單數量增多,這種經過程序中轉一次的方式,顯然並不能使人滿意,MySql中有沒有一種方式,可以知足批量生成符合條件的排行榜時的名次批量生成嗎?(例如:按特定要求生成排行榜,每一個目的地下是否有排行榜,排行榜數量都不肯定的狀況)排序
若是可以生成名次列,咱們就能夠方便的經過INNER JOIN的方式將榜單成員記錄和榜單的對應關係連起來。(這裏就不贅述)開發
下面是一個批量生成分類型的排行榜(按評分score從高到低排序)it
-- POI基礎表 CREATE TABLE temp_poi ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, -- 名稱 type_id VARCHAR(255) NOT NULL, -- 類型 score int NOT NULL, -- 評分 PRIMARY KEY(id) ); -- 生成測試數據 INSERT INTO temp_poi(name,type_id,score) VALUES('a',1,75) ,('b',2,28) ,('c',1,77) ,('d',3,55) ,('e',2,88) ,('f',3,37) ,('g',1,49) ,('h',2,57) ,('i',1,63) ,('j',3,44) ; -- 生成帶名次的榜單 SELECT type_id ,id ,score ,@position := if(@previous = type_id, @position, 0) + 1 AS position ,@previous := type_id FROM temp_poi , (SELECT @previous := -1, @position := 0) AS s -- 很是重要的一行 ORDER BY type_id ,score DESC ;
其中一行代碼:io
, (SELECT @previous := -1, @position := 0) AS s
若是缺失會致使很是隱蔽的錯誤:在首次鏈接MySql後的第一次運行時會致使排名計算出錯(以後就正常了)基礎