[MySQL]自动排名

前言

在做项目的时候需要根据用户的积分做一个排名和排名趋势(上升、下降或持平),上一篇博客已经写过排名趋势了:点击打开链接 ,现在,就来谈谈自动排名。

正文

排名首先考虑的问题是并列名次,下面的代码就可以有效解决并列问题。

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

然后定时器可以自定义设置多久执行一次。

完。










猜你喜欢

转载自blog.csdn.net/vop444/article/details/80185093