MySql批處理的小竅門:排行榜類數據生成

MySql批處理的小竅門:排行榜類數據生成

最近在作新版本的開發,其中涉及到排行榜的批量預生成,在此分享給你們。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後的第一次運行時會致使排名計算出錯(以後就正常了)基礎

相關文章
相關標籤/搜索