文档章节

mysql给数据统计做排名

 小田天
发布于 2015/12/14 14:21
字数 680
阅读 106
收藏 1

1、问题描述


目前有一个表tb_rank(PlayerID,PlayerName,Score) PlayerID是Primary key(主键);

现在的需求是,希望在表tb_rank中再添加一列rankNum,这个rankNum记录的是Score的排名

根据分数做降序排列)。



2、初步解决方法(不考虑Score相同的情况)


问题分析

    经过分析,我们可以将此问题大概分解为以下三个子问题:

(1) 在表tb_rank中增加一列rankNum;

ALTER TABLE tb_rank ADD rankNum INT;

(2)对表tb_rank中的Score列进行降序排名,且将排名数值增加到被排序的元组中;

初次执行排序可以使用

SELECT PlayerID,PlayerName,Score,(@rank:=IFNULL(@rank,0)+1) rankNum 
FROM tb_rank 
ORDER  BY Score DESC

普遍使用的排序SQL为

SET @rank:=0;
SELECT PlayerID,PlayerName,Score,(@rank:=@rank+1) rankNum 
FROM tb_rank 
ORDER  BY Score DESC

(3)用第2步的结果来更新新增列rankNum的值。

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;


排名的tb_rank表查询返回的结果为



    到此就实现了简单的排名了。但是这里存在一个问题,就是说当score相同的时候,

比如:

PlayerID是’12‘和’13‘以及’123456‘,它们的Score都是1000,

但是查询出来的结果在排名上的呈现却不一致。

    这个是不合理的。下面第3节介绍一种解决方法。


3、更进一步的解决方法


实现思路

    产生第二步中同样的分数出现不同的排名的问题,其根因是排名实现没有考虑分数相同的情况,

下面增加一个变量@preScore来保存产生当前元组时,上一个元组的分数;然后在生成排名的列,

根据当前元组的分数与上一个元组的分数大小进行比较,如果相等,那么排名不变,否则排名加1。

    编写SQL语句需要注意一点,对变量@preScore的赋值需要放到排名列rankNum之后,

要让其先生成排名,而后才可以更新@preScore变量。

从SQL语句的结果生成原理上看,SELECT语句中,写在前面的列值是先生成,

写在后面的列值是后得到的。例如,下面的SELECT语句中,

PlayerID的位置放在最前面,那么实际返回查询结果的时候,是先获取PlayerID的值的。

<pre name="code" class="sql">SET @rank:=0;
SET @preScore:=0;


SELECT PlayerID,( IF( @preScore<>Score,@rank :=@rank+1,@rank ) ) rankNum,@preScore:=Score FROM tb_rank ORDER BY score DESC



最后合成后的SQL语句为


SET @rank:=0;
SET @preScore:=0;

UPDATE tb_rank, (SELECT PlayerID,( IF( @preScore<>Score,@rank:=@rank+1,@rank ) ) rankNum,@preScore:=Score  
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;


© 著作权归作者所有

粉丝 1
博文 84
码字总数 49841
作品 0
怀化
私信 提问
4 月数据库排名 —— MySQL 上升到第 2 位

根据 DB-Engines 发布的 4 月份最新的数据库排名显示,MySQL 上升迅速,目前已经超过微软的 SQL Server 排在第二位,下表是前 50 名详细的排名数据: 完整的记录请看 http://db-engines.com/...

oschina
2013/04/10
15K
56
那些年,我们用过的数据库

文章转载自「开发者圆桌」一个关于开发者入门、进阶、踩坑的微信公众号 2016年数据库盘点 说到盘点,首先肯定得看看DB-Engines的全球数据库排名。下表是2017年1月份前20名数据库引擎最新排名...

开发者圆桌
2017/03/30
0
0
spark 大型项目实战(一):用户访问session分析(1) --模块介绍

模块的目标:对用户访问的session 进行分析 1、可以根据使用者指定的某些条件,筛选出指定的一些用户(有特定年龄、职业、城市); 2、对这些用户在指定日期范围内发起的session,进行聚合统...

u012957549
2018/05/12
0
0
选材网统计功能参考,大家补充一下!也可以去分享处下载

1 店铺统计 1.1 流量统计 1.1.1 店铺总流量 统计条件:本周/本月/本年/时间段 统计图: x坐标:日/月 y坐标:次数 1.1.2 商品流量排名 统计条件:本周/本月/本年/时间段 统计图: x坐标:次数...

chaogetu
2015/05/06
2
0
2014年最全面统计报告之开发者服务市场占有率

开发者在选用服务时总是不知道如何下手,有句话说得好“让市场检验竞争力”。DevStore调查了国内近十家应用市场,抽取了其中近14万应用,通过技术手段和数据分析,得出此开发者服务市场占有率...

牵着蜗牛去西藏
2015/01/26
294
0

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
39分钟前
3
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
6
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
5
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
4
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部