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的值的。)

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;

mysql给数据做排名_mysql给数据统计做排名相关推荐

  1. linux成功mysql数据直接拷贝_mysql数据库数据从一个linux系统移植到另一个linux系统的方法...

    背景 问题介绍 现在有一个linux系统的机器上数据需要移植到另外一个linux系统上.老机器称A机器,新机器称B机器. 前期调研 鉴于网上资料很多都是相同内容,而数据库的数据一般都很重要,这些方法都 ...

  2. 向 mysql导入数据 源码_MySQL 导入数据

    MySQL 导入数据 MySQL中可以使用两种简单的方式来导入MySQL导出的数据. 使用 LOAD DATA 导入数据 MySQL 中提供了LOAD DATA INFILE语句来插入数据. 以下实例 ...

  3. mysql冷区域热区域_mysql的数据备份方式,及热备与冷备的优缺点对比

    一.按照数据库的运行状态分类: (1)热备:在数据库运行时,直接进行备份,对运行的数据库没有影响 (2)冷备:在数据库停止运行的时候进行备份,这种备份方式最为简单,只需要拷贝数据库物理文件即可. (3 ...

  4. mysql删减表的关键字_Mysql 删除数据及数据表

    在Mysql 中删除数据以及数据表非常的容易,但是需要特别小心,因为一旦删除所有数据都会消失. 删除数据 删除表内数据,使用delete关键字. 删除指定条件的数据 删除用户表内id 为1 的用户:d ...

  5. mysql 插入前查重_Mysql插入数据前查重

    常见插入数据的SQL insert into 插入数据库时会检查主键是否存在,存在会报错 replace into 替换数据库记录,需要表中有主键或者unique索引,如果数据库已存在的数据,会先删除 ...

  6. 用mysql完成的实际案例_mysql完成SQL统计的案例

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

  7. mysql统计数据的代码_MySQL按时间统计数据的方法介绍(代码示例)

    本篇文章给大家带来的内容是关于MySQL按时间统计数据的方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在做数据库的统计时,经常会需要根据年.月.日来统计数据,然 ...

  8. mysql 数据修改记录日志_mysql对数据的更新操作记录在哪个日志中?

    mysql对数据的更新操作记录在通用查询日志和二进制日志中.通用查询日志用来记录用户的所有操作,包括启动和关闭 MySQL 服务.更新语句和查询语句等:二进制日志会以二进制的形式记录数据库的各种操作, ...

  9. MySQL导出的文件权限_mysql导出数据到文件权限问题

    mysql导出数据到文件权限问题 发布时间:2020-06-02 14:31:42 来源:51CTO 阅读:630 作者:Mirajane 问题: mysql> select * from pr ...

最新文章

  1. 迭代器接口IteratorAggregate 与类 ArrayIterator(转)
  2. iOS-设计模式-观察者模式-KVO
  3. JQ实现三个Select下拉框互斥
  4. python 代码转程序_python将代码转换成网页
  5. 进程互斥的要求与实现方法
  6. android 信息添加附件功能,Android实现带附件的邮件发送功能
  7. Qt模态界面设置setWindowModality禁止其他界面响应
  8. 一篇文章讲清Go的内存布局和分配原理
  9. 基于Matlab的跨孔CT胖射线追踪算法(五)
  10. word中文字贴表格线方法
  11. python不换行空格输出_解决Python print输出不换行没空格的问题
  12. 杨凌职业技术学院计算机专业宿舍,杨凌职业技术学院宿舍条件,宿舍图片和环境空调及分配方法...
  13. 华三中各种路由协议的缺省优先级
  14. MIT线性代数习题全解
  15. Unity Shader零基础入门4:纹理贴图与法线贴图
  16. 解决Chrome浏览器变慢
  17. markdown格式,默写
  18. 创业日志:一个和尚挑水喝,两个和尚抬水喝,三个和尚没水喝?
  19. uni-app 中文档阅读倒计时
  20. 财政部、税务总局:集成电路设计和软件企业免两年所得税

热门文章

  1. 全国第九大电商平台倒了!创始人卷走260亿,1200万人被骗
  2. 2020年最新Java面试题免费下载!
  3. 让 Linux 防火墙新秀 nftables 为你的 VPS 保驾护航
  4. 如何优雅关闭 Spring Boot 应用
  5. Guava 源码分析(Cache 原理)
  6. ibatis mysql like_关于ibatis中like用法的补充
  7. 点云配准网络 PCRNet: Point Cloud Registration Network using PointNet Encoding 2019
  8. Unsupported ONNX opset version: 11
  9. 速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法
  10. python 多维 条件获取