mysql 计算排名_mysql计算用户排名 - 冯奎博客 — 再牛逼的梦想,也抵不住你傻逼似的坚持。 — Fengkui Blog...

有时,在做统计的时候,我们需要根据某个字段来计算排名,

下面介绍一下如何使用原生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);

学生成绩表数据

SELECT * FROM table_score ORDER BY score DESC;

0afc1a71893e5bc5a028eee36f6b379c.png

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

SELECT *,

(SELECT count(DISTINCT score) FROM table_score AS b WHERE a.score

(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; #获取学生周一的成绩排名和与上一名的成绩差

2f5724006cf46a38f20efd9f70f29346.png

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

SELECT *,

(SELECT count(DISTINCT score) FROM table_score AS b WHERE a.score

FROM table_score AS a ORDER BY rank; #获取学生成绩排名

a5a6d0161bd72faa4e69c6bc24ba6884.png

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

SELECT a.*,

(@rowNum:=@rowNum+1) AS rank #计算行号

FROM table_score AS a,

(SELECT (@rowNum :=0) ) b

ORDER BY a.score DESC;

c951164dff2bd3501c5b844f35eeca48.png

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

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;

be332e788a82c89cb98ab9f3576aad8d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值