2014-10-17 60 views
0

我試圖從包含國家/地區代碼數據的3個不同列的表中選擇不同國家/地區代碼的列表。從包含相似數據的多列中選擇唯一值

Raw           Desired 

+-----------+-----------+-----------+  +-----------+ 
| country_1 | country_2 | country_3 |  | countries | 
+-----------+-----------+-----------+  +-----------+ 
| GBR  | GBR  | IRL  |  | ARG  | 
| DEU  | FRA  | CHE  |  | AUS  | 
| CHN  | CHN  | IND  |  | BRA  | 
| USA  | CAN  | MEX  |  | CAN  | 
| AUS  | JAP  | KOR  |  | CHE  | 
| BRA  | ARG  | ARG  |  | CHN  | 
| NOR  | SWE  | FIN  |  | DEU  | 
| GBR  | FRA  | GBR  |  | FIN  | 
| IRL  | IRL  | IRL  |  | FRA  | 
+-----------+-----------+-----------+  | GBR  | 
              | IND  | 
              | IRL  | 
              | JAP  | 
              | KOR  | 
              | MEX  | 
              | NOR  | 
              | SWE  | 
              | USA  | 
              +-----------+ 

到目前爲止我來最接近的是一個像查詢:

mysql> SELECT 
     CONCAT(
      (SELECT GROUP_CONCAT(DISTINCT country_1 ORDER BY country_1) FROM tbl), 
      ',', 
      (SELECT GROUP_CONCAT(DISTINCT country_2 ORDER BY country_2) FROM tbl), 
      ',', 
      (SELECT GROUP_CONCAT(DISTINCT country_3 ORDER BY country_3) FROM tbl) 
     ) AS countries; 

+-------------------------------------------------------------------------------------------------+ 
| countries                      | 
+-------------------------------------------------------------------------------------------------+ 
| AUS,BRA,CHN,DEU,GBR,IRL,NOR,USA,ARG,CAN,CHN,FRA,GBR,IRL,JAP,SWE,ARG,CHE,FIN,GBR,IND,IRL,KOR,MEX | 
+-------------------------------------------------------------------------------------------------+ 

但是你可以看到,仍然有重複,我不當然,我也可以讓他們成爲行。

任何幫助表示讚賞!

+0

爲什麼'ARG'在你想要的結果集中?它不是在你的桌子上出現過兩次嗎? – 2014-10-17 14:41:54

回答

2

我不知道你爲什麼要使用組連接。使用聯合可以輕鬆完成所需的結果,這會自動刪除重複項。

SELECT country1 AS countries FROM tab 
UNION 
SELECT country2 FROM tab 
UNION 
SELECT country3 FROM tab 
ORDER BY 1; 
1

您會得到重複項,因爲您僅在每列中刪除重複項,而不是整體。你可能想要更像這樣的東西:

SELECT GROUP_CONCAT(country) 
    FROM (
    SELECT DISTINCT country1 AS country FROM tbl 
    UNION 
    SELECT DISTINCT country2 AS country FROM tbl 
    UNION 
    SELECT DISTINCT country3 AS country FROM tbl 
)