前言
在做项目的时候需要根据用户的积分做一个排名和排名趋势(上升、下降或持平),上一篇博客已经写过排名趋势了:点击打开链接 ,现在,就来谈谈自动排名。
正文
排名首先考虑的问题是并列名次,下面的代码就可以有效解决并列问题。
SELECT id, total_Mcoin, ( SELECT COUNT(*) + 1 FROM t_user s WHERE s.total_Mcoin > t_user.total_Mcoin ) pm FROM t_user
代码解析:就是创建一个新表 s 和 原表 t_user 中的 total_Mcoin 属性比较,s 表中第一行 s.total_Mcoin 中的值和 t_user 表中任意一行 total_Mcoin 中的值比较,若没有比它大的,则给表中对应元组pm属性为1,若有一个比它大的,则对应元租pm属性为2,以此类推。。
这时,可以看到已经按照 total_Mcoin中积分的大小进行了排名,并且,并列排名也已经完美显示
需要注意的是,pm属性是在代码中定义的,实际表中并没有这个属性所以,应该在SQL代码中把pm的值赋值给库中对应的排名属性。
UPDATE t_user u, ( SELECT id, total_Mcoin, ( SELECT COUNT(*) + 1 FROM t_user s WHERE s.total_Mcoin > t_user.total_Mcoin ) pm FROM t_user ) r SET u.paiming = r.pm WHERE u.id = r.id;
如代码所示,根据id吧排名好的pm属性赋值给原表中paiming属性
拓展
由于要做的功能还有排名趋势,上一篇文章也介绍过了,但是现在要分两步,写两个定时器,所以就把代码结合一下,先把旧的排名信息赋值给oldpaiming,然后在进行新的排名,只需要对比oldpaiming和paiming的值就可以分析出排名趋势了。
最终存储过程代码:
BEGIN UPDATE t_user SET oldpaiming = paiming; UPDATE t_user u, ( SELECT id, total_Mcoin, ( SELECT COUNT(*) + 1 FROM t_user s WHERE s.total_Mcoin > t_user.total_Mcoin ) pm FROM t_user ) r SET u.paiming = r.pm WHERE u.id = r.id; END
然后定时器可以自定义设置多久执行一次。
完。