mysql根据成绩排名次_用mysql语句 实现按成绩 排名次
mysql:查询排名
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 复制代码 执行的结果如下图:
可以看到,现在按照分数从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 复制代码 这时候就新增加了一个变量,用于记录上一条数据的分数了,只要当前数据分数跟上一条数据的分数比较,相同分数的排名就不变,不相同分数的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较
如下图结果:
跟第一条sql的结果相对比你会发现,分数相同的排名也相同,并且最后一名的名次由第9名变成了第7名;
如果你需要分数相同的排名也相同,但是后面的排名不能受到分数相同排名相同而不占位的影响,也就是哪怕你排名相同,你也占了这个位置(比如:1,2,2,4,5,5,7....这种形式的,虽然排名有相同,但是你占位了,后续的排名根据占位来排)
三、sql2{只要数据有相同的排名就一样,但是相同排名也占位,排名依次排序(1,2,2,4,5,5,7.....)}
此时需呀再增加一个变量,来记录排序的号码(自增)
按 Ctrl+C 复制代码
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 按 Ctrl+C 复制代码 上面sql执行的结果如下:
结果集中分数相同的,排名相同,同时它也占据了那个位置,中间的一个数据过程本人截图了,请往下看(跟上图做对比你就明白了):
本文参考
http://www.cnblogs.com/zengguowang/p/5541431.html
http://www.bubuko.com/infodetail-823289.html
USE test_db;
建表
CREATE TABLE t_rank
(
pid INT(4) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
age INT(3),
groupid INT
)
插入
INSERT INTO t_rank(NAME,age,groupid)
VALUES
(‘Peter’, 19, 1),
(‘Andre’,20, 1),
(‘Vino’,20, 3),
(‘John’,25, 3),
(‘Tom’,24, 4),
(‘Brian’,21, 4),
(‘Andy’,22, 3),
(‘George’,23, 4),
(‘Dew’,23, 4),
(‘Kris’,25, 4),
(‘Samual’,25, 4),
(‘William’,26, 2);
(相同数值自动排名,没有并列)
降序排名 没有并列,相同系统自动给出序号,按照年龄排序,永远都是排名数+1
SELECT pid, NAME, age, @curRank := @curRank + 1 AS rank
FROM t_rank r,(SELECT @curRank := 0) t
ORDER BY age
(相同数值相同排名)方法一
暂存上一条记录age(@preRank),如果当前age与其相等,使用与之前记录相同的排名,否则加1,更新@preRank
说明:
1.定义当前的排名是0,前一个排名=NULL
2.当前行排名数与前一个排名相同,输出相同排名
3.否则,将当前行排名数赋值给前一个排名,并且当前排名数+1
SELECT pid, NAME, age,
CASE
WHEN @preRank = age THEN @curRank
WHEN @preRank := age THEN @curRank := @curRank + 1
END AS rank
FROM t_rank r, (SELECT @curRank := 0, @preRank := NULL ) t
ORDER BY age
相同数值,相同排名,不同数值,以前面多少个为准
SELECT pid, NAME, age,
@rownum := @rownum + 1 AS tmp,
@incrnum := CASE
WHEN @rowtotal = age THEN @incrnum
WHEN @rowtotal := age THEN @rownum
END AS rownum
FROM
(
SELECT pid, NAME, age
FROM t_rank
ORDER BY age DESC
) AS a,(SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0) b
(相同数值相同排名)方法二
增加一个变量(@incRank) 用于记录序号
1.如果当前age与前一个记录记录相同,使用前一个记录相同数
2.否则使用序号
说明:
判断IF(@preRank = age, @curRank, @incRank)
如果 当前行数据等于前一个排名就是当前排名
测试变量是否正确
SELECT pid, NAME, age,@curRank,
@curRank := IF(@preRank = age, @curRank, @incRank) AS rank, #最新排名值,永远复制给@curRank,并且输出
@incRank := @incRank + 1, #自增
@preRank := age #记录了最新上一个排名值 20
FROM t_rank r,(SELECT @curRank := 0, @preRank := NULL, @incRank := 1) t
ORDER BY age
2.将排名信息显示出来
SELECT pid, NAME, age, rank
FROM (
SELECT pid, NAME, age,
@curRank := IF(@preRank = age, @curRank, @incRank) AS rank,
@incRank := @inRank + 1,
@preRank := age
FROM t_rank r,(SELECT @curRank := 0, @preRank := NULL, @incRank := 1) t
ORDER BY age
) s
mysql根据成绩排名次_用mysql语句 实现按成绩 排名次相关推荐
- 2021年重庆高考成绩排名查询,2021年重庆理科高考成绩排名一分一段表,重庆高考理科成绩排名查询...
2017年重庆理科高考成绩排名一分一档表,重庆高考理科成绩排名查询 今年重庆市普通高考报名总人数255460人,比去年增加4801人,增幅接近2%,为直辖以来连续18年正增长.除已经录取的高职单招.保 ...
- 2021高考甘肃师大附中成绩查询,2021甘肃理科高考成绩排名一分一档表,甘肃高考理科成绩排名查询...
2015甘肃理科高考成绩排名一分一档表甘肃高考理科成绩排名查询 肃省2017年高考文科状元出炉,来自民乐一中的王复英以总分676分摘取理科第一名桂冠.文科状元惠雅婕来自西北师大附中,总分660分.恭喜 ...
- mysql一秒查询次数_单个select语句实现MySQL查询统计次数
单个select语句实现MySQL查询统计次数 单个select语句实现MySQL查询统计次数的方法用处在哪里呢?用处太多了,比如一个成绩单,你要查询及格得人数与不及格的人数,怎么一次查询出来? My ...
- mysql 自动化运维工具_部署MySQL自动化运维工具inception+archer
*************************************************************************** 部署MySQL自动化运维工具inception+ ...
- mysql 横纵表转化_数据库MySQL横纵表相互转化操作实现方法
本文实例讲述了MySQL横纵表相互转化操作实现方法.分享给大家供大家参考,具体如下: 先创建一个成绩表(纵表) create table user_score ( name varchar(20), ...
- mysql和python的关系_八MySQL与Python
<1>数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. ...
- mysql inner join 长数字_关于mysql inner join 链接查询的优化
在使用查询语句时,inner join,left join,right join等这些联接语句,想必你们并不陌生,并且常常会用到,联接达到了咱们想要的结果,但是当数据越大越大的时候,会发现查询很慢,每 ...
- mac下安装mysql 5.7.11卡住_【mysql】Mac下安装mysql5.7 完整步骤,大坑已解决
最近使用Mac系统,准备搭建一套本地web服务器环境.因为Mac系统自带PHP和apach,但是没有自带mysql,所以要手动去安装mysql,本次安装mysql最新版5.7.17. 1.官网下载 点 ...
- MySQL数据库实用教程考核_《MySQL数据库实用教程》郑明秋,蒙连超,赵海侠【pdf】...
内容简介 郑明秋.蒙连超.赵海侠主编的<MySQL数据库实用教程>是作者在多年的数据库开发实践与教学经验的基础上,根据计算机相关专业的职业岗位能力需求及学生的认知规律倾心组织编写的.本教材 ...
最新文章
- 频率分布直方图组距如何确定_QC七大手法之直方图法,快快转发、收藏!
- 使用svn控制系统的优缺点和注意事项
- python软件是免费的吗-python属于软件吗
- 无界面(webdriver.PhantomJS)访问有道
- 信号与系统matlab课设报告,MATLAB信号与系统实验报告
- 高级考题_理论干货最最直观的词云分布,带你一次看清天大考题端倪!
- Sublime Text 4不显示未注册的方法
- Google预训练语言模型T5
- EverEdit - 值得关注的国产原创开发的免费高效优秀的文本与代码编辑器
- 小型计算机和Pc,超小型台式电脑:重量相当于两个新iPhone
- android 三维软件 cad,CAD建模号APP
- Git 撤销已提交的文件
- C++ 求最大公因数
- js 获得明天0点时间戳_开群通知!昨日提示厦门信达、申通地铁、国林科技、隆盛科技全部涨停!明天这只龙头股有望继续涨停!...
- SR-IOV虚拟出来的网卡如何被VPP(DPDK)接管
- MATLAB随机森林回归模型
- 测试人员都应该是好的产品人员
- 基于centos 安装配置环境
- Python判断一个五位数是否为回文数
- 用二进制数字串生成二维码图片
热门文章
- 在 Arch Linux 上使用人脸识别(howdy)来登陆和认证
- 为什么你成不了数据分析高手?可能是缺少这个思维
- 10分钟教你用Python获取百度地图各点的经纬度信息
- 《从0到1:CTFer成长之路》1.3 任意文件读取漏洞
- web前端开发10大战略性技术蓝图
- ESP32程序调试 win10 使用OPENOCD及GDB工具
- oracle创建和删除表空间,oracle 表空间创建和删除
- 深度揭秘Xshell后门事件:入侵感染供应链软件的大规模定向攻击
- 【备品备件】入库流程--赠品入库,商贸入库和退库入库
- sgu482 Impudent Thief (动态规划)