zoukankan      html  css  js  c++  java
  • mysql 排名

    一、sql1{不管数据相同与否,排名依次排序(1,2,3,4,5,6,7.....)}

    SELECT
        obj.user_id,obj.score,@rownum := @rownum + 1 AS rownum
    FROM
        (
            SELECT
                user_id,
                score
            FROM
                `sql_rank`
            ORDER BY
                score DESC
        ) AS obj,
        (SELECT @rownum := 0) r

    结果如下

    可以看到,现在按照分数从1到9都排好序了,但是有些分数相同的用户排名却不一样,这就是接下来要说的第二种sql

    二、sql2{只要数据有相同的排名就一样,排名依次排序(1,2,2,3,3,4,5.....)}

    SELECT
        obj.user_id,
        obj.score,
        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
                user_id,
                score
            FROM
                `sql_rank`
            ORDER BY
                score DESC
        ) AS obj,
        (SELECT @rownum := 0 ,@rowtotal := NULL) r

    这时候就新增加了一个变量,用于记录上一条数据的分数了,只要当前数据分数跟上一条数据的分数比较,相同分数的排名就不变,不相同分数的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较

    如下图结果:

    跟第一条sql的结果相对比你会发现,分数相同的排名也相同,并且最后一名的名次由第9名变成了第7名;

    如果你需要分数相同的排名也相同,但是后面的排名不能受到分数相同排名相同而不占位的影响,也就是哪怕你排名相同,你也占了这个位置(比如:1,2,2,4,5,5,7....这种形式的,虽然排名有相同,但是你占位了,后续的排名根据占位来排)

    三、sql2{只要数据有相同的排名就一样,但是相同排名也占位,排名依次排序(1,2,2,4,5,5,7.....)}  

       此时需呀再增加一个变量,来记录排序的号码(自增)

    SELECT
        obj_new.user_id,
        obj_new.score,
        obj_new.rownum
    FROM
        (
            SELECT
                obj.user_id,
                obj.score,
                @rownum := @rownum + 1 AS num_tmp,
                @incrnum := CASE
            WHEN @rowtotal = obj.score THEN
                @incrnum
            WHEN @rowtotal := obj.score THEN
                @rownum
            END AS rownum
            FROM
                (
                    SELECT
                        user_id,
                        score
                    FROM
                        `sql_rank`
                    ORDER BY
                        score DESC
                ) AS obj,
                (
                    SELECT
                        @rownum := 0 ,@rowtotal := NULL ,@incrnum := 0
                ) r
        ) AS obj_new

    上面sql执行的结果如下:

    结果集中分数相同的,排名相同,同时它也占据了那个位置,中间的一个数据过程本人截图了,请往下看(跟上图做对比你就明白了):

  • 相关阅读:
    phpstrom中Terminal窗口打开
    window安装reidis完成之后,想要把数据存入redis,必须开扩展,不然报错,redis windows phpstudy 安装扩展
    Windows 安装 Anaconda3+PyCharm
    表单序列化+ajax跨域提交
    微信小程序无法获取到unionId(专业踩坑20年)
    支付宝的同步和异步的区别
    layui多图上传
    多图上传控制器及模型代码(2)thinkphp5+layui实现多图上传保存到数据库,可以实现图片自由排序,自由删除。
    【JZOJ4816】【NOIP2016提高A组五校联考4】label
    【JZOJ4815】【NOIP2016提高A组五校联考4】ksum
  • 原文地址:https://www.cnblogs.com/duanc/p/8623428.html
Copyright © 2011-2022 走看看