sql语句查询排名

思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从而实现排序;

mysql里则是需要先将数据查询出来并先行按照需要排序的字段做好降序desc,或则升序asc,设置好排序的变量(初始值为0):

a>.将已经排序好的数据从第一条依次取出来,取一条就自增加一,实现从1到最后的一个排名

b>.当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加1

c.当出现相同的数据时,排名保持不变,但是保持不变的排名依旧会占用一个位置,也就是类似于(1,2,2,2,5)这种排名就是属于中间的三个排名是一样的,但是第五个排名按照上面一种情况是(1,2,2,2,3),现在则是排名相同也会占据排名的位置

准备数据(用户id,分数):

CREATE TABLE `sql_rank` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`user_id` int(11) unsigned NOT NULL,

`score` tinyint(3) unsigned NOT NULL,

`add_time` date NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入数据:

INSERT INTO sql_rank (user_id, score, add_time)

VALUES

(100, 50, ‘2016-05-01’),

(101, 30, ‘2016-05-01’),

(102, 20, ‘2016-05-01’),

(103, 60, ‘2016-05-01’),

(104, 80, ‘2016-05-01’),

(105, 50, ‘2016-05-01’),

(106, 70, ‘2016-05-01’),

(107, 85, ‘2016-05-01’),

(108, 60, ‘2016-05-01’)

当前数据库数据:

一、sql1{不管数据相同与否,排名依次排序(1,2,3,4,5,6,7…..)}

SELECT

obj.user_id,obj.score,@rownum := @rownum + 1 AS rownum

FROM

(

SELECT

user_id,

score

FROM

`sql_rank`

ORDER BY

score DESC

) AS obj,

(SELECT @rownum := 0) r

SELECT

obj.user_id,obj.score,@rownum := @rownum + 1 AS rownum

FROM

(

SELECT

user_id,

score

FROM

`sql_rank`

ORDER BY

score DESC

) AS obj,

(SELECT @rownum := 0) r

执行的结果如下图:

可以看到,现在按照分数从1到9都排好序了,但是有些分数相同的用户排名却不一样,这就是接下来要说的第二种sql

二、sql2{只要数据有相同的排名就一样,排名依次排序(1,2,2,3,3,4,5…..)}

SELECT

obj.user_id,

obj.score,

CASE

WHEN @rowtotal = obj.score THEN

@rownum

WHEN @rowtotal := obj.score THEN

@rownum :=@rownum + 1

WHEN @rowtotal = 0 THEN

@rownum :=@rownum + 1

END AS rownum

FROM

(

SELECT

user_id,

score

FROM

`sql_rank`

ORDER BY

score DESC

) AS obj,

(SELECT @rownum := 0 ,@rowtotal := NULL) r

SELECT

obj.user_id,

obj.score,

CASE

WHEN @rowtotal = obj.score THEN

@rownum

WHEN @rowtotal := obj.score THEN

@rownum :=@rownum + 1

WHEN @rowtotal = 0 THEN

@rownum :=@rownum + 1

END AS rownum

FROM

(

SELECT

user_id,

score

FROM

`sql_rank`

ORDER BY

score DESC

) AS obj,

(SELECT @rownum := 0 ,@rowtotal := NULL) r

这时候就新增加了一个变量,用于记录上一条数据的分数了,只要当前数据分数跟上一条数据的分数比较,相同分数的排名就不变,不相同分数的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较

如下图结果:

跟第一条sql的结果相对比你会发现,分数相同的排名也相同,并且最后一名的名次由第9名变成了第7名;

如果你需要分数相同的排名也相同,但是后面的排名不能受到分数相同排名相同而不占位的影响,也就是哪怕你排名相同,你也占了这个位置(比如:1,2,2,4,5,5,7….这种形式的,虽然排名有相同,但是你占位了,后续的排名根据占位来排)

三、sql2{只要数据有相同的排名就一样,但是相同排名也占位,排名依次排序(1,2,2,4,5,5,7…..)}此时需呀再增加一个变量,来记录排序的号码(自增)

SELECT

obj_new.user_id,

obj_new.score,

obj_new.rownum

FROM

(

SELECT

obj.user_id,

obj.score,

@rownum := @rownum + 1 AS num_tmp,

@incrnum := CASE

WHEN @rowtotal = obj.score THEN

@incrnum

WHEN @rowtotal := obj.score THEN

@rownum

END AS rownum

FROM

(

SELECT

user_id,

score

FROM

`sql_rank`

ORDER BY

score DESC

) AS obj,

(

SELECT

@rownum := 0 ,@rowtotal := NULL ,@incrnum := 0

) r

) AS obj_new

SELECT

obj_new.user_id,

obj_new.score,

obj_new.rownum

FROM

(

SELECT

obj.user_id,

obj.score,

@rownum := @rownum + 1 AS num_tmp,

@incrnum := CASE

WHEN @rowtotal = obj.score THEN

@incrnum

WHEN @rowtotal := obj.score THEN

@rownum

END AS rownum

FROM

(

SELECT

user_id,

score

FROM

`sql_rank`

ORDER BY

score DESC

) AS obj,

(

SELECT

@rownum := 0 ,@rowtotal := NULL ,@incrnum := 0

) r

) AS obj_new

上面sql执行的结果如下:

结果集中分数相同的,排名相同,同时它也占据了那个位置,中间的一个数据过程本人截图了,请往下看(跟上图做对比你就明白了):

转载:http://www.cnblogs.com/zengguowang/p/5541431.html

最后编辑:2017-04-18作者:开心乐窝

mysql 查询成绩排名_mysql 学生成绩查询排名相关推荐

  1. JSP+Mysql 做一个简单的学生成绩查询web系统

    IDEA基于JSP+Mysql 做一个简单的学生成绩查询web系统 目录 一.相关软件的下载和配置环境 Java环境的下载和配置 (1)IDEA的下载和安装 ​ (2)JdK的安装 Tomcat的下载 ...

  2. mysql子查询字符串位置_MySql基础-子查询

    一.子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中. 子查询用()括起来 子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询. 子查询可以包含普通select可以包括的任 ...

  3. c语言else if设计一个成绩表,c语言 学生成绩管理系统设计学生成绩信息包括:学号,姓名,三门课程成绩(数学、英语和计算机)等。主要功能:(1) 计算各...

    共回答了9个问题采纳率:88.9% 希望对你有所帮助. #include"stdio.h" #include"stdlib.h" #include"s ...

  4. 输入学生成绩,输出学生成绩等级,学习成绩>=90且<=100分的同学用A表示,60-89分之间的用B表示,<60且>0分以下的用C表示。其余输入都有误!“

    java输入学生成绩,输出学生成绩等级,学习成绩>=90且<=100分的同学用A表示,60-89分之间的用B表示,<60且>0分以下的用C表示.其余输入都有误!"(最 ...

  5. c语言编译学生成绩统计,c语言:编写程序,输入是个学生的学号、姓名成绩,输出学生成绩等级和不及格人数。...

    c语言:编写程序,输入是个学生的学号.姓名成绩,输出学生成绩等级和不及格人数.0 定义调用set_grade()设置等级A85 100 C60 69 B70 84 D 0 59 #include #i ...

  6. c语言按学号查询学生排名极其考试成绩,C语言--学生成绩管理系统

    某班最多有不超过30人(具体人数由键盘输入)参加某门课程的考试.用一维数组作函数参数实现如下学生成绩管理: (1)录入每个学生学号和考试成绩: (2)计算课程的总分和平均分: (3)按成绩由高到低排出 ...

  7. eclipse基于 JSP+Mysql 做一个简单的学生成绩查询web系统

    文章目录 一.配置环境 一.eclipse的下载和安装 二.JDK的安装和配置 三.tomcat的下载安装和环境配置 四.eclipse下载插件 二.eclipse将项目部署到tomcat上 三.连接 ...

  8. 西南石油大学计算机二级成绩查询,西南石油大学本科学生成绩自助查询打印终端管理办法...

    Measures for Management of Self-service Score Inquiry and Printing Terminal for Undergraduate Studen ...

  9. 成绩查询系统c语言,学生成绩查询系统C语言代码(分服务器端和客户端).doc

    学生成绩查询系统C语言代码(分服务器端和客户端) 客户端:#include#include#include #pragma comment(lib , "Wsock32.lib " ...

最新文章

  1. android AIDL IPC深入分析
  2. 端到端问答新突破:百度提出RocketQA,登顶MSMARCO榜首
  3. 【错误记录】编译 ijkplayer 报错 (fatal error: ijksoundtouch/ijksoundtouch_wrap.h: No such file or directory )
  4. 基础理论:集合的Hausdorff距离
  5. 编写python脚本完成图片拼接
  6. 第0周作业2:博客阅读和思考
  7. 【小梅哥SOPC学习笔记】系统时钟的使用
  8. ​EMC存储产品介绍分析(二):大数据利器Isilon (2)
  9. Hyper-V 3.0网络虚拟化PART 3:内部交换机
  10. ALSA驱动、设备函数调用关系
  11. mysql实际项目中使用多长时间_mysql常在项目中使用的语句总结
  12. html页面右下角添加js广告,JS右下角悬浮广告代码的简单示例
  13. ABAP ALV DEMO示例源码
  14. cαr怎么发音_英文字母在线发音
  15. 如何使用vsCode+Icarus verilog+GTKwave编写并仿真verilog
  16. 恶意软件Emotet卷土重来滥用.LNK文件进行攻击,你只需要一项技术就能有效保护组织
  17. 聊聊HTTPS环境DNS优化:美图App请求耗时节约近半案例
  18. Dell服务器进入双系统按键,dell进bios按什么键 戴尔进bios的方法
  19. html里怎样返回首页,返回上一页-html页面返回上一页面怎么写
  20. 【Docker】自定义dockerfile构建容器镜像并发布

热门文章

  1. 前台离岗提示语_前台卫生温馨提示语
  2. Mysql数据库命令大全(一)
  3. 让你欲罢不能的十部电影推荐!
  4. 从技法到兵法:今天为何必须关注物理世界的企业智能?
  5. element ui table的show-overflow-tooltip属性以及设置其宽度
  6. 多孔纳米金的研究进展
  7. 3D Human Body Reshaping with Anthropometric Modeling 阅读翻译
  8. 轻松打造开源安全信息管理平台
  9. 通过源码分析各种Map(含LinkedHashMap、IdentityHashMap、ConcurrentHashMap)
  10. 【C语言刷题】青蛙跳台阶