2014-10-17 68 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 
)