zoukankan      html  css  js  c++  java
  • MySQL实现排名并查询指定用户排名功能,并列排名功能

     

    表结构:
    CREATE TABLE test.testsort (
      id int(11) NOT NULL AUTO_INCREMENT,
      uid int(11) DEFAULT 0 COMMENT '用户id',
      score decimal(10, 2) DEFAULT 0.00 COMMENT '分数',
      PRIMARY KEY (id)
    )
    ENGINE = INNODB
    AUTO_INCREMENT = 1
    CHARACTER SET utf8
    COLLATE utf8_general_ci
    COMMENT = '测试排序'
    ROW_FORMAT = DYNAMIC;

    思路:可以先排序,再对结果进行编号;也可以先查询结果,再排序编号。

     
    说明:
    @rownum := @rownum + 1 中 := 是赋值的作用,这句话的意思是先执行@rownum + 1,然后把值赋给@rownum;
    (SELECT @rownum := 0) r 这句话的意思是设置rownum字段的初始值为0,即编号从1开始。
     
     

    实现排名:

    方法一:

    SELECT
      t.*,
      @rownum := @rownum + 1 AS rownum
    FROM (SELECT
             @rownum := 0) r,
         (SELECT
             *
           FROM testsort
           ORDER BY score DESC) AS t;

    方法二:

    SELECT
      t.*,
      @rownum := @rownum + 1 AS rownum
    FROM (SELECT
             @rownum := 0) r,
         testsort AS t
    ORDER BY t.score DESC;
    结果:
     
     
     

    查看指定用户排名:

    方法一:

    SELECT
      b.*
    FROM (SELECT
        t.*,
        @rownum := @rownum + 1 AS rownum
      FROM (SELECT
               @rownum := 0) r,
           (SELECT
               *
             FROM testsort
             ORDER BY score DESC) AS t) AS b
    WHERE b.uid = 222;

     方法二:

    SELECT
      b.*
    FROM (SELECT
        t.*,
        @rownum := @rownum + 1 AS rownum
      FROM (SELECT
               @rownum := 0) r,
           testsort AS t
      ORDER BY t.score DESC) AS b
    WHERE b.uid = 222;
     结果:
     

    实现并列排名(相同分数排名相同):

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

    查询指定用户并列排名:

    SELECT
      total.*
    FROM (SELECT
        obj.uid,
        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
               uid,
               score
             FROM testsort
             ORDER BY score DESC) AS obj,
           (SELECT
               @rownum := 0,
               @rowtotal := NULL) r) AS total
    WHERE total.uid = 222;
     
     
  • 相关阅读:
    百度图片
    在线人数统计
    mysql简易导入excel
    asp.net 导出excel带图片
    C# 正则验证
    js生成随机数
    YQL获取天气
    取html里的img和去html标签
    客户端信息获得《转》
    使用ASP.NET上传图片汇总
  • 原文地址:https://www.cnblogs.com/woods1815/p/9595494.html
Copyright © 2011-2022 走看看