(@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.
selectScore,@i := @i + (@pre <> ( @pre :=Score)) RankfromScores,
(select @i := 0,@pre := -1) initorder by Score desc
这里需要注意的是变量@pre。由于我们在权重那里判断是根据@pre(前一个score的值)是否等于当前score的值,如果@pre的初始值为大于0的数,就可能判断出错。最好@pre的初始值设置为小于0的数。
MySQL之如何巧用变量
标签:观察 core 3.0 -- tab scores generate 工作 value
本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉
本文系统来源:http://www.cnblogs.com/rever/p/7149995.html