当前位置:Gxlcms > 数据库问题 > MySQL之如何巧用变量

MySQL之如何巧用变量

时间:2021-07-01 10:21:17 帮助过:16人阅读

(@i:=@i+1) as i,table_name.* from table_name,(select @i:=0) as it

上述是从网上随便找到一个自动添加序号的语句。我们观察上面的SQL语句,并分析含有变量的SQL语句的结构。

首先把干扰项as去掉,as只是给查询结果取了一个别名,此处我们不必考虑as。

select score , (@i:=@i+1)from Scores,(select @i:=0) init order by score desc

这样的输出结果是:

{"headers": ["score", "(@i:=@i+1)"], "values": [[4.00, 1.0], [4.00, 2.0], [3.85, 3.0], [3.65, 4.0], [3.65, 5.0], [3.50, 6.0]]}

看看上面的结果,我们已经实现了一半的要求了。只不过现在结果中的序号没有满足“相同的值有相同的权重”这个要求。此时我们需要引入另一个变量@pre来保存上一个score。

当计算权重时如果@pre跟当前score相等,则@i保持原值(或者说+0),否则加1.

select 
    Score, 
    @i := @i + (@pre <> ( @pre := Score)) Rank 
from 
    Scores, 
    (select @i := 0,@pre := -1) init 
order by Score desc

这里需要注意的是变量@pre。由于我们在权重那里判断是根据@pre(前一个score的值)是否等于当前score的值,如果@pre的初始值为大于0的数,就可能判断出错。最好@pre的初始值设置为小于0的数。

MySQL之如何巧用变量

标签:观察   core   3.0   --   tab   scores   generate   工作   value   

人气教程排行