最近在作新版本的开发,其中涉及到排行榜的批量预生成,在此分享给你们。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后的第一次运行时会致使排名计算出错(以后就正常了)基础