前言
mysql免费开源,相信做数据的同学基本都会接触到此数据库。那给一些数据进行排名,是我们在数据处理过程中很常见的事情,但是mysql没有直接的rank排名函数,如何解决这个问题呢。那今天就给大家讲解下如何在mysql里如何实现在排名 :
案例示范:
1. 建表并插入数据:
CREATE TABLE `cats` (
`cid` int(50) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`length` int(10) NOT NULL,
PRIMARY KEY (`cid`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `cats` (`cid`, `name`, `length`) VALUES
(1, 'A', 18),
(2, 'B', 17),
(3, 'C', 23),
(4, 'D', 21),
(5, 'E', 20),
(6, 'F', 27),
(7, 'G', 15),
(8, 'H', 19),
(9, 'I', 26),
(10, 'J', 19),
(11, 'K', 20),
(12, 'L', 22),
(13, 'M', 17),
(14, 'N', 18),
(15, 'O', 23);
2.实现rank一般排名
实现增加排名字段的列、并按照legth升序,初始化定义变量@curRank := 0:
SELECT cid, name, length, @curRank := @curRank + 1 AS rank
FROM cats p, (
SELECT @curRank := 0
) q
ORDER BY length
或者使用set声明变量:
SET @curRank := 0;
SELECT cid, name, length, @curRank := @curRank + 1 AS rank
FROM cats
ORDER BY length
3、实现以多字段排名
先以length降序、再以name排列,与上面类似,加一个字段排序就好了。
SELECT cid, name, length, @curRank := @curRank + 1 AS rank
FROM cats p, (
SELECT @curRank := 0
) q
ORDER BY length DESC, name
4、实现并列排名(第一种情况)
相同length值排名一样;且下一个大的length值的排名加1,如下:
SELECT cid, name, length,
CASE
WHEN @prevRank = length THEN @curRank
WHEN @prevRank := length THEN @curRank := @curRank + 1
END AS rank
FROM cats p,
(SELECT @curRank :=0, @prevRank := NULL) r
ORDER BY length
5、实现并列排名(第二种情况)
相同length值排名一样;且下一个大的length值的排名按照所处的行数,进行排序,也就是它在多少行,排名就是多少,如下:
SELECT cid, name, length, rank FROM
(SELECT cid, name, length,
@curRank := IF(@prevRank = length, @curRank, @incRank) AS rank,
@incRank := @incRank + 1,
@prevRank := length
FROM cats p, (
SELECT @curRank :=0, @prevRank := NULL, @incRank := 1
) r
ORDER BY length) s
好了,是不是很好的解决了我们的排名问题了呢,赶快试试吧~~