我有一个包含以下内容的表格:
name
-------
Michael
Michael
Michael
Michael
John
John
John
Alex
Alex
我需要对它们进行排名:
name | rank
--------|------
Michael |1
Michael |2
Michael |3
Michael |4
John |1
John |2
John |3
Alex |1
Alex |2
我该如何执行这个操作?
简单易懂,
CREATE TABLE customer (
name CHAR(30) NOT NULL,
rank MEDIUMINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (name,rank)) ENGINE=MyISAM;
INSERT INTO customer (name) VALUES
('Michael'),('Michael'),('John'),('Alex'),('Michael'),('John');
SELECT * FROM customer ORDER BY name,rank;
MySQL本身没有直接实现这个功能的方法,但你可以通过一些技巧来实现:
SET @prev := null;
SET @cnt := 1;
SELECT name, IF(@prev <> name, @cnt := 1, @cnt := @cnt + 1) AS rank, @prev := name
FROM yourtable
ORDER BY name
Rank()
函数是不可原谅的,所以我们不得不采取这样奇怪的解决方案(请注意,如果您不包括ENGINE=MyISAM
,它将无法工作)。 - EliSquared