mysql给数据统计做排名
2015-12-14 00:00
246 查看
1、问题描述
目前有一个表tb_rank(PlayerID,PlayerName,Score) PlayerID是Primary key(主键);现在的需求是,希望在表tb_rank中再添加一列rankNum,这个rankNum记录的是Score的排名(根据分数做降序排列)。2、初步解决方法(不考虑Score相同的情况)
问题分析:经过分析,我们可以将此问题大概分解为以下三个子问题:(1) 在表tb_rank中增加一列rankNum;(2)对表tb_rank中的Score列进行降序排名,且将排名数值增加到被排序的元组中;初次执行排序可以使用:ALTER TABLE tb_rank ADD rankNum INT;
普遍使用的排序SQL为:SELECT PlayerID,PlayerName,Score,(@rank:=IFNULL(@rank,0)+1) rankNum FROM tb_rank ORDER BY Score DESC
(3)用第2步的结果来更新新增列rankNum的值。SET @rank:=0; SELECT PlayerID,PlayerName,Score,(@rank:=@rank+1) rankNum FROM tb_rank ORDER BY Score DESC
排名的tb_rank表查询返回的结果为:到此就实现了简单的排名了。但是这里存在一个问题,就是说当score相同的时候,比如:PlayerID是’12‘和’13‘以及’123456‘,它们的Score都是1000,但是查询出来的结果在排名上的呈现却不一致。这个是不合理的。下面第3节介绍一种解决方法。SET @rank:=0; UPDATE tb_rank,(select PlayerID,( @rank:=@rank+1) rankNum FROM tb_rank ORDER BY score DESC) temp_tb_rank SET tb_rank.rankNum=temp_tb_rank.rankNum WHERE tb_rank.PlayerID=temp_tb_rank.PlayerID;
3、更进一步的解决方法
实现思路:产生第二步中同样的分数出现不同的排名的问题,其根因是排名实现没有考虑分数相同的情况,下面增加一个变量@preScore来保存产生当前元组时,上一个元组的分数;然后在生成排名的列,根据当前元组的分数与上一个元组的分数大小进行比较,如果相等,那么排名不变,否则排名加1。编写SQL语句需要注意一点,对变量@preScore的赋值需要放到排名列rankNum之后,要让其先生成排名,而后才可以更新@preScore变量。(从SQL语句的结果生成原理上看,SELECT语句中,写在前面的列值是先生成,写在后面的列值是后得到的。例如,下面的SELECT语句中,PlayerID的位置放在最前面,那么实际返回查询结果的时候,是先获取PlayerID的值的。)SELECT PlayerID,( IF( @preScore<>Score,@rank :=@rank+1,@rank ) ) rankNum,@preScore:=Score FROM tb_rank ORDER BY score DESC最后合成后的SQL语句为:<pre name="code" class="sql">SET @rank:=0; SET @preScore:=0;
SET @rank:=0;SET @preScore:=0;UPDATE tb_rank, (SELECT PlayerID,( IF( @preScore<>Score,@rank:=@rank+1,@rank ) ) rankNum,@preScore:=ScoreFROM tb_rankORDER BY score DESC) temp_tb_rankSET tb_rank.rankNum=temp_tb_rank.rankNumWHERE tb_rank.PlayerID=temp_tb_rank.PlayerID;
相关文章推荐
- mysql索引
- Navicat for MySQL工具中大小写敏感的情况下表名称会出现变小写
- MySQL管理多个实例的方法 推荐
- Mysql数据库常用命令
- hive partition 动态分区时字符乱码,无法删除
- Mysql存储引擎对比之:innoDB与MyISAM
- MySQL开启远程登录权限
- MySQL Master_Slave主从配置
- mysql密码mac
- kettle spoon中“表输入”到“表输出”的乱码问题
- zabbix安装指南
- MySQL 存储过程那点事儿
- Mysql数据库默认编码修改。
- MySQL安装步骤
- 【mysql】关于悲观锁
- MySQL PreparedStatement执行时传入的中文是乱码
- mysql中替换字符串(正则) 模糊
- Kettle连接Mysql数据库异常
- MySQL Proxy
- Mysql主从数据库配置