mysql排名(查询篇)

    xiaoxiao2022-06-29  39

    本文参考 http://www.cnblogs.com/zengguowang/p/5541431.html http://www.bubuko.com/infodetail-823289.html

    USE test_db;

    建表

    CREATE TABLE t_rank ( pid INT(4) PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, age INT(3), groupid INT )

    插入

    INSERT INTO t_rank(NAME,age,groupid) VALUES (‘Peter’, 19, 1), (‘Andre’,20, 1), (‘Vino’,20, 3), (‘John’,25, 3), (‘Tom’,24, 4), (‘Brian’,21, 4), (‘Andy’,22, 3), (‘George’,23, 4), (‘Dew’,23, 4), (‘Kris’,25, 4), (‘Samual’,25, 4), (‘William’,26, 2);


    (相同数值自动排名,没有并列)

    降序排名 没有并列,相同系统自动给出序号,按照年龄排序,永远都是排名数+1 SELECT pid, NAME, age, @curRank := @curRank + 1 AS rank FROM t_rank r,(SELECT @curRank := 0) t ORDER BY age

    (相同数值相同排名)方法一

    暂存上一条记录age(@preRank),如果当前age与其相等,使用与之前记录相同的排名,否则加1,更新@preRank

    说明: 1.定义当前的排名是0,前一个排名=NULL 2.当前行排名数与前一个排名相同,输出相同排名 3.否则,将当前行排名数赋值给前一个排名,并且当前排名数+1

    SELECT pid, NAME, age, CASE WHEN @preRank = age THEN @curRank WHEN @preRank := age THEN @curRank := @curRank + 1 END AS rank FROM t_rank r, (SELECT @curRank := 0, @preRank := NULL ) t ORDER BY age

    相同数值,相同排名,不同数值,以前面多少个为准

    SELECT pid, NAME, age, @rownum := @rownum + 1 AS tmp, @incrnum := CASE WHEN @rowtotal = age THEN @incrnum WHEN @rowtotal := age THEN @rownum END AS rownum FROM ( SELECT pid, NAME, age FROM t_rank ORDER BY age DESC ) AS a,(SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0) b

    (相同数值相同排名)方法二

    增加一个变量(@incRank) 用于记录序号 1.如果当前age与前一个记录记录相同,使用前一个记录相同数 2.否则使用序号 说明: 判断IF(@preRank = age, @curRank, @incRank) 如果 当前行数据等于前一个排名就是当前排名

    测试变量是否正确 SELECT pid, NAME, age,@curRank, @curRank := IF(@preRank = age, @curRank, @incRank) AS rank, #最新排名值,永远复制给@curRank,并且输出 @incRank := @incRank + 1, #自增 @preRank := age #记录了最新上一个排名值 20 FROM t_rank r,(SELECT @curRank := 0, @preRank := NULL, @incRank := 1) t ORDER BY age

    2.将排名信息显示出来 SELECT pid, NAME, age, rank FROM ( SELECT pid, NAME, age, @curRank := IF(@preRank = age, @curRank, @incRank) AS rank, @incRank := @inRank + 1, @preRank := age FROM t_rank r,(SELECT @curRank := 0, @preRank := NULL, @incRank := 1) t ORDER BY age ) s

    转载请注明原文地址: https://ju.6miu.com/read-1125120.html

    最新回复(0)