2013-08-21 72 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