2013-02-06 56 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)作为外键存储在当前表中。