一、使用@自定义变量
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)