900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > mysql根据成绩排名次_用mysql语句 实现按成绩 排名次

mysql根据成绩排名次_用mysql语句 实现按成绩 排名次

时间:2022-04-21 06:07:42

相关推荐

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, '-05-01'), (101, 30, '-05-01'), (102, 20, '-05-01'), (103, 60, '-05-01'), (104, 80, '-05-01'), (105, 50, '-05-01'), (106, 70, '-05-01'), (107, 85, '-05-01'), (108, 60, '-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执行的结果如下:

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

本文参考

/zengguowang/p/5541431.html

/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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。