zoukankan      html  css  js  c++  java
  • mysql考试成绩排名-关于@rowtotal、@rownum

    表:

     数据:

     1. 用户可以多次考试,以最新的为准

    SELECT
        t.* 
    FROM
        ( SELECT * FROM t_demo ORDER BY begin_time DESC ) t 
    GROUP BY
        t.user_id 
    ORDER BY
        t.score DESC 

    结果:

     2. 排名:分数一样的排名一样

    SELECT
        obj.user_id,
        obj.score,
        obj.begin_time,
    CASE
        
        WHEN @rowtotal = obj.score THEN
        @rownum 
        WHEN @rowtotal := obj.score THEN
        @rownum := @rownum + 1 
        WHEN @rowtotal = 0 THEN
        @rownum := @rownum + 1 
        END AS rownum 
    FROM
        (
    SELECT
        t.* 
    FROM
        ( SELECT * FROM t_demo ORDER BY begin_time DESC ) t 
    GROUP BY
        t.user_id 
    ORDER BY
        t.score DESC 
        ) AS obj,
        ( SELECT @rownum := 0, @rowtotal := NULL ) r

    解析:

     @rownum初始值为0,@rowtotal初始值为null:@rowtotal :是复制的意思

    第一次

    第一个WHEN,不会执行

    WHEN @rowtotal = obj.score THEN
    @rownum

    第二个WHEN,赋值后发现@rowtotal为100,100为true,将执行

    @rownum为1

    第三个WHEN,只有当第二个WHEN赋值后变为0,第二个WHEN不会执行,将执行第三个,即第一次遇到0执行

    下一次遇到0,将在第一个WHEN就执行了。

    每一步脚印都要扎得深一点!
  • 相关阅读:
    迪杰斯特拉算法简单分析
    华科机考:二叉排序树(改)
    华科机考:八进制
    华科机考:阶乘
    华科机考:找位置
    华科机考:回文字符串
    华科机考:a+b
    华科机考:N阶楼梯上楼
    华科机考:大整数排序
    iOS 适配iOS9
  • 原文地址:https://www.cnblogs.com/bloodthirsty/p/12371808.html
Copyright © 2011-2022 走看看