mysql排名(查询篇)

本文参考
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)
如果 当前行数据等于前一个排名就是当前排名

  1. 测试变量是否正确
    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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值