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;
     
     
  • 相关阅读:
    BZOJ 1977: [BeiJing2010组队]次小生成树 Tree( MST + 树链剖分 + RMQ )
    BZOJ 2134: 单选错位( 期望 )
    BZOJ 1030: [JSOI2007]文本生成器( AC自动机 + dp )
    BZOJ 2599: [IOI2011]Race( 点分治 )
    BZOJ 3238: [Ahoi2013]差异( 后缀数组 + 单调栈 )
    ZOJ3732 Graph Reconstruction Havel-Hakimi定理
    HDU5653 Bomber Man wants to bomb an Array 简单DP
    HDU 5651 xiaoxin juju needs help 水题一发
    HDU 5652 India and China Origins 并查集
    HDU4725 The Shortest Path in Nya Graph dij
  • 原文地址:https://www.cnblogs.com/woods1815/p/9595494.html
Copyright © 2011-2022 走看看