MySQL排名、并列排名

一、使用@自定义变量

      1、MySQL的@与@@区别

      @x 是 用户自定义的变量  (User variables are written as @var_name)
      @@x 是 global或session变量  (@@global  @@session )
      2、@@查看全局变量:
      
select   @@log_error;
      3、@设置全局变量值:
     
mysql> SET @t1=0, @t2=0, @t3=0; mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
      4、自定义变量并赋值
     
@i := 0

二、顺序排名:

#在基础表中拼接上一个自定义变量rank 初始值为0
#外层查询 自定义变量自增+1

SELECT
	t.user_id,
	t.score,
	@rank := @rank + 1 from 
(select *, @rank := 0 from user_score order by score desc) t

三、并列排名(不占位)

# 增加一个自定义变量lastVal用来记录上一条记录的score值
# 使用case when 或者 if 判断语句,生成rank值
# lastVal赋值要放在case when语句后面,等rank字段的值生成后再赋值lastVal
SELECT
	t.user_id,
	t.score,
	case 
		when @lastVal = t.score then @rank
		else @rank := @rank+1
	end as rank,
	@lastVal := score from 
(select *, @rank := 0,@lastVal := 0 from user_score order by score desc) t


四、并列排名(占位)

# 在并列排名(不占位)的基础上增加变量 realRank记录新的排名值,其初始值取1
# 用rank变量记录realRank在遇到不同记录时的值
​
SELECT
	t.user_id,
	t.score,
	case 
		when @lastVal = t.score then @rank
		else @realRank
	end as rank,
	if(@lastVal != t.score,@rank := @realRank,@rank),
    @realRank := @realRank + 1,
    @rank,
	@realRank,
	@lastVal := score from 
(select *, @rank := 0,@lastVal := 0,@realRank := 1 from user_score order by score desc) t

 

注意:
        1、之前参考过一些博客,lastVal这个变量的初始值是null,因为null和的判断是is null 或 is not null。因此,第一次判断score = @lastVal 时,如果@lastVal初始值是null的时候,第一行记录的判断永远返回null,即if 或者 case when 无法根据表达式做后续操作
        2、Mysql对布尔类型表达式返回结果为1(true) 0(false)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值