2013-08-21 30 views
2

我有一个表有一列如下:由集团中的排名的MySQL

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 

我如何执行?

回答

5

没有什么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 

这种事情是容易在您的客户端应用程序完成的。

+0

由于空值的从2(2,3,4,5)的秩为开始迈克尔。如果我设置@prev:='string',结果是正确的。谢谢。 – user1889867

+0

Marc,请查看下面的评论。在MySql中执行它并不困难 –

+0

这不可靠,因为没有定义读取@prev并写入(在单个SELECT中)的评估顺序。见http://dev.mysql.com/doc/refman/5.5/en/user-variables.html – Chris

3

简单,

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; 
+0

是的,现在你已经有了一个简单的数字序列。 OP需要一个序列PER名称,而不是每个表。 –

+1

它会以他想要的相同方式工作,它会按照名称添加序列。试试吧。 –

+0

这是一个很棒的伎俩。我已经为这个特定的答案提供了六次堆栈溢出。 – BringMyCakeBack