2013-02-06 57 views
1

假設我有以下幾點:如何在MySQL中進行分組?

TABLEA

id (auto increment primary key) | age | country 
1 | 5 | Germany 
2 | 6 | Spain 
3 | 7 | France 
4 | 7 | Spain 
5 | 8 | France 
6 | 9 | France 
7 | 2 | Mexico 
8 | 7 | Saudi Arabia 
9 | 5 | Saudi Arabia 

我想要的結果表:

TABLEA

id (auto increment primary key) | age | country | country_number 
1 | 5 | Germany | 1 
2 | 6 | Spain | 2 
3 | 7 | France | 3 
4 | 7 | Spain | 2 
5 | 8 | France | 3 
6 | 9 | France | 3 
7 | 2 | Mexico | 4 
8 | 7 | Saudi Arabia | 5 
9 | 5 | Saudi Arabia | 5 

請注意,根據 「country_number」 只是一個唯一的編號任何一個獨特的國家名稱是。

使用光標很慢。我如何做到這樣我可以做某種「分組」?爲每個國家分配一個唯一的標識符?或者是沒有必要的團體?

+0

更新回答爲s逐步的操作。 –

回答

2

查詢可能是(你不會有5沙特阿拉伯,但至少每個國家不同的country_number)

select a.id, a.age, a.country, b.minId as country_number 
FROM TableA a 
INNER JOIN (SELECT MIN(id) as minId, country 
      FROM TableA 
      GROUP BY country) as b 
     ON a.country = b.country 

SqlFiddle

要正確地做事情,

CREATE TABLE COUNTRY(id int PRIMARY KEY auto_increment, name VARCHAR(100)) 
SELECT distinct COUNTRY as name FROM TableB; 

ALTER TABLE TableB Add column countryID int NOT NULL DEFAULT 0; 

UPDATE TableB b, country c 
set b.countryID = c.Id 
where b.country = c.name; 

ALTER TABLE TableB drop column country; 

ALTER TABLE TableB add FOREIGN KEY(countryID) REFERENCES country(id); 

看到SqlFiddle

+0

我改變了一些插入值,並注意到有一個編號問題(注意4,5,6在下面的SqlFiddle中被跳過)。哪裏不對? http://sqlfiddle.com/#!2/10b3b/1/0。 – Rolando

+0

@Damascusi正如答案中所說的那樣,每個國家都會有一個唯一的ID,但不是順序的(查詢僅針對每個國家/地區的表中最小的ID)。隨着第二個版本(國家表),你會有順序值(在開始時)。 –

1

您應該創建一個單獨的表來存儲國家/地區,然後將國家/地區的主鍵(country_id)作爲外鍵存儲在當前表中。