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后的第一次运行时会致使排名计算出错(以后就正常了)基础

相关文章
相关标签/搜索