SQL语句题目rank排名

MYSQL,SQL语句题目:

试验用的简书上的一个数据表脚本:

CREATE TABLE `players` ( `pid` int(2) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `age` int(2) NOT NULL, PRIMARY KEY (`pid`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB; 

INSERT INTO `players` (`pid`, `name`, `age`) VALUES (1, 'Samual', 25), (2, 'Vino', 20), (3, 'John', 20), (4, 'Andy', 22), (5, 'Brian', 21), (6, 'Dew', 24), (7, 'Kris', 25), (8, 'William', 26), (9, 'George', 23), (10, 'Peter', 19), (11, 'Tom', 20), (12, 'Andre', 20);

实现:

1.排名不跳级,按顺序排序下来:

select p.pid,p.name,p.age,tmp.rank1 from players p 
left join (select a.age,@rank :=@rank + 1 as rank1 
    from (select age from players group by age) a ,(select @rank:=0) tmp ORDER BY a.age                             
     desc ) tmp on p.age=tmp.age order by p.age desc,p.name desc;

这是基本的实现方式,但是如果players表数据过大,里面包含了子表嵌套查询,表连接会影响执行的效率。

我想的最佳实现方式可能是:

select p.pid,p.name,p.age, 
case when @curentValue =p.age THEN @currank 
     when @currentValue := p.age THEN @currank := 1+@currank end as currentRank, @curentValue := p.age 
from players p , (select @currank := 0,@curentValue :=null) tmp
 order by p.age desc,p.name desc

 

2.排名跳级

select p.pid,p.name,p.age, 
case when @curentValue =p.age THEN @currank 
     when @currentValue := p.age THEN @currank := 1+@jumpRank end as currentRank, @curentValue := p.age, @jumpRank := @jumpRank +1 
from players p , 
(select @currank := 0,@jumpRank := 0,@curentValue :=null) tmp
 order by p.age desc,p.name desc

 

 

 

至于第一种实现方式会不会产生笛卡尔积,参看blog:https://blog.csdn.net/zy_281870667/article/details/81046573

抛开笛卡尔积不说,我认为起码第一种实现方式,表连接是会导致查询效率变低的。

 

还有个坑爹的地方:

我用的mysql版本8.0.12.。。。。写sql开始用的AS rank, 报错了!

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值