本文为冯奎原创文章,转载无需和我联系,但请注明来自冯奎博客fengkui.net

有时,在做统计的时候,我们需要根据某个字段来计算排名,
下面介绍一下如何使用原生mysql进行排名计算,
首先用户定义一个变量,然后将想要的值存储在变量中,可以在后面的语句中引用该变量。
用户自定义的变量具有会话专一性,即一个客户端创建的自定义变量不能被其他客户端所使用,
当客户端退出时,该客户端创建的所有自定义变量会自动释放。
用户自定义变量的形式:@variableName
设置自定义变量;set @a=0,@b:=0; select @c:=0;

  • = 只有在set、update时才跟:=一样是赋值作用,其他都是等于作用。
  • := 赋值作用,不止在set、update时是赋值作用,在select 时也是赋值作用。

用于统计的数据表结构与数据:

DROP TABLE IF EXISTS `table_score`;
CREATE TABLE `table_score`  (
  `s_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `s_name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
  `score` int(10) NOT NULL COMMENT '成绩',
  PRIMARY KEY (`s_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `table_score` VALUES (1, '周一', 20),(2, '周二', 50),(3, '周三', 25),(4, '周四', 88),(5, '周五', 71),(6, '周六', 51),(7, '周日', 36),(8, '赵一', 50),(9, '钱二', 64),(10, '孙三', 81),(11, '李四', 29),(12, '周周', 88),(13, '吴五', 69),(14, '郑七', 75),(15, '王八', 82);
Mysql

学生成绩表数据

SELECT * FROM table_score ORDER BY score DESC;
Mysql
冯奎博客

获取某个学生成绩排名并计算该学生和上一名学生成绩差,是并列排名

SELECT *,
(SELECT count(DISTINCT score) FROM table_score AS b WHERE a.score<b.score)+1 AS rank, #获取排名,并列
(SELECT b.score FROM table_score AS b WHERE b.score>a.score ORDER BY b.score LIMIT 1)-a.score AS subtract #获取和上一名学生成绩的差
FROM table_score AS a WHERE a.s_id = 13; #获取学生周一的成绩排名和与上一名的成绩差
Mysql
冯奎博客

获取所有学生成绩排名-并列排名

SELECT *,
(SELECT count(DISTINCT score) FROM table_score AS b WHERE a.score<b.score)+1 AS rank #获取排名-并列
FROM table_score AS a ORDER BY rank; #获取学生成绩排名
Mysql
冯奎博客

获取所有学生成绩排名,不是并列排名。计算行号进行排名

SELECT a.*,
(@rowNum:=@rowNum+1) AS rank #计算行号
FROM table_score AS a,
(SELECT (@rowNum :=0) ) b
ORDER BY a.score DESC;
Mysql
冯奎博客

计算单独某个学生成绩排名,不是并列排名

SELECT * FROM
(SELECT a.*,(@rowNum:=@rowNum+1) AS rank FROM table_score AS a,(SELECT (@rowNum :=0) ) b ORDER BY a.score DESC) # 学生成绩排名,非并列排名
c WHERE c.s_id = 13;
Mysql
冯奎博客
夜河资源网提供的所有内容仅供学习与交流。通过使用本站内容随之而来的风险以及法律责任与本站无关,所承担的法律责任由使用者承担。
一、如果您发现本站侵害了相关版权,请附上本站侵权链接和您的版权证明一并发送至邮箱:yehes#qq.com(#替换为@)我们将会在五天内处理并断开该文章下载地址。
二、本站所有资源来自互联网整理收集,全部内容采用撰写共用版权协议,要求署名、非商业用途和相同方式共享,如转载请也遵循撰写共用协议。
三、根据署名-非商业性使用-相同方式共享 (by-nc-sa) 许可协议规定,只要他人在以原作品为基础创作的新作品上适用同一类型的许可协议,并且在新作品发布的显著位置,注明原作者的姓名、来源及其采用的知识共享协议,与该作品在本网站的原发地址建立链接,他人就可基于非商业目的对原作品重新编排、修改、节选或者本人的作品为基础进行创作和发布。
四、基于原作品创作的所有新作品都要适用同一类型的许可协议,因此适用该项协议, 对任何以他人原作为基础创作的作品自然同样都不得商业性用途。
五、根据二〇〇二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可不经软件著作权人许可,无需向其支付报酬!
六、鉴此,也望大家按此说明转载和分享资源!本站提供的所有信息、教程、软件版权归原公司所有,仅供日常使用,不得用于任何商业用途,下载试用后请24小时内删除,因下载本站资源造成的损失,全部由使用者本人承担!