背景

有这么一张表,记录名字和分数,现在需要按照成绩排名,存在并列名次的情况

解决方法

思路:按照score从大到小排序,第一行数据就是第一名,第二行就是第二名......需要判断当前行的score和上一行的score的大小用来区分是否排名

先看解决代码:

SELECT name,score
CASE
WHEN @preScore = score THEN @curRank WHEN @preScore := score
THEN @curRank:=@curRank +1 END AS `Rank`
FROM score,(SELECT @curRank := 0 AS curRank, @preScore := NULL AS preRank) i WHERE sex=1 ORDER BY score DESC

细节说明

@preScore 这种是变量声明,类似之前的set ,set @a = 1;

:=  赋值,@preScore := 1,表示给@preScore赋值为1;

(SELECT @curRank := 0 AS curRank, @preScore := NULL AS preRank) i 单独派生出一个表,记得要加别名,不然会包如下的错误
Every derived table must have its own alias -- 派生出来的表都要有一个别名

  新增两列的表,一列是当前排名curRank,一个是上条记录的score值preScore,赋予默认值,curRank=0,preScore=null;

下面的操作类似linux中的awk操作

1. 按照score倒序排列,即score最大的一行,第一名的一条记录;

2. 先判断@preScore是否跟当前查询出来的score一致,因为默认@preScore为null,那不一致,不执行THEN后面的;

3. 进入到第二个WHEN,THEN中

4. 将当前查询出来的score=99赋值给@preScore,没有判断条件直接进入到THEN,@curRank=0+1,为1

5. 将@curRank 写为别名Rank=1

6. 第二条记录扫描

7. 先判断@preScore(此时为99)跟第二条记录的score(此时为89)对比,不相等,不执行THEN后面的数据;

8. 将当前查询出来的score=89赋值给@preScore,没有判断条件直接进入到THEN,@curRank=1+1,为2

9. 将@curRank 写为别名Rank=1

......

扫描完所有的记录后得到上表

case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略。

当有score一样的情况时,@preScore=score时,@curRank并没有做+1操作,所以就有了并列的情况

mysql @value := 用法的更多相关文章

  1. 【转载】 mysql explain用法

    转载链接:  mysql explain用法 官网说明:     http://dev.mysql.com/doc/refman/5.7/en/explain-output.html 参数:  htt ...

  2. 知识点:Mysql 基本用法之存储过程

    存储过程 一. 介绍 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql 使用存储过程的优点: 用于替代程序写的SQL语句,实现程序与sql ...

  3. 知识点:Mysql 基本用法之视图

    视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时 ...

  4. 知识点:Mysql 基本用法之流程控制

    流程控制 一. 条件语句 if 语句实例: delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = ...

  5. 知识点:Mysql 基本用法之函数

    函数 MySQL中提供了许多内置函数 例如: sql 内置函数: 一.数学函数 ROUND(x,y) 返回参数x的四舍五入的有y位小数的值 RAND() 返回0到1内的随机值,可以通过提供一个参数(种 ...

  6. 知识点:Mysql 基本用法之触发器

    触发器 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为 注意:没有查询 一 .创建触发器 触发器基础语法: # 插入前 CREATE TRIGGER tri_before_insert_ ...

  7. 知识点:Mysql 基本用法之事务

    事务 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 事务实例: create table user( id int primar ...

  8. Mysql基本用法-存储引擎-04

    MYSQL中只有 INNODB和BDB 类型的数据表才能支持事务处理!其他的类型是不支持的!(切记!) Mysql基本用法-存储引擎-02中的test_user表 和 phpcvs表 <?php ...

  9. ThinkPHP第十一天(关联模型使用,独立分组配置,MySQL concat用法)

    1.关联模型的使用 定义方式:新建一个类文件UserRelationModel.class.php Class UserRelationModel extends RelationModel{ pro ...

  10. mysql distinct 用法详解及优化

    本事例实验用表task,结构如下 MySQL> desc task; +-------------+------------+------+-----+-------------------+- ...

随机推荐

  1. jvm005 从jvm的角度谈谈线程的实现

    一.线程的实现 在谈谈线程之前,我们要先知道线程是何物?在学习操作系统时,我们得知进程和线程的概念,接下来我们将开始揭示线程. 什么是进程?通过任务管理器我们就看到了进程的存在.而通过观察,我们发现只 ...

  2. thinkphp分页带数据

    因为用thinkphp做分页时候点击下一页后搜索栏的数据会清空,然后点击下一页后刷新完了就没有内容了,感觉网上查找和我自己研究在不适用ajax做分页的情况下用以下代码就可以实现!!通过把值扔地址栏来进 ...

  3. SecureFX 乱码问题

    英文平时连终端的都是用SecureCRT, 今天试了一些SecureFX, 结果乱码了, 把redhat下的中文桌面标题显示乱码, 然后参考了一下别的前辈, 完美解决, 下面是解决办法: 1.找到配置 ...

  4. java文件上传Demo

    说到文件上传我们要做到: 1.引入两个包:commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar 2.将form改为上传文件模式:enctype=" ...

  5. centos7下编译安装mysql

    推荐: http://www.cnblogs.com/yunns/p/4877333.html

  6. (转)Linux下安装firefox最新版

    为了方便在linux服务器上面进行web调试,安装火狐浏览器 1下载 首先去火狐主页,中文是http://www.firefox.com.cn/,点击"免费下载" 2 解压并创建快 ...

  7. 【canvas学习笔记二】绘制图形

    上一篇我们已经讲述了canvas的基本用法,学会了构建canvas环境.现在我们就来学习绘制一些基本图形. 坐标 canvas的坐标原点在左上角,从左到右X轴坐标增加,从上到下Y轴坐标增加.坐标的一个 ...

  8. 【JAVASCRIPT】React学习- 数据流(组件通信)

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 一 组件通信如何实现 父子组件之间不存在继承关系 1.1 父=>子通信 父组件可以通过 this.refs.xx ...

  9. 【CSS】整屏大背景

    1. 利用div的层次,设置底层div充满屏幕,并给div设置背景图 <div id="Layer1" style="position:absolute;top:0 ...

  10. docker在Centos上的安装

    Centos6安装docker 系统:centos6.5 内核:3.10.107-1(已升级),docker对RHEL/Centos的最低内核支持是2.6.32-431,epel源的docker版本推 ...