2016-11-18 40 views
0

我有一个表中包含的国家代码和语言IDMYSQL串联列不进行分组

+------+------+-------------+ 
| id | iso | language_id | 
+------+------+-------------+ 
| 1 | US |  4  | 
| 2 | IE |  1  | 
| 3 | DE |  2  | 
| 4 | SG |  1  | 
| 5 | FR |  3  | 
| 6 | UK |  1  | 
| 7 | AT |  2  | 
+------+------+-------------+ 

我需要的是一个MySQL的语句,将返回一个包含EVERY ISO和IDS其中一个连接字符串的结果集语言ID匹配

在上面的例子中

所以,我希望得到

+------+------+----------+ 
| id | iso | id_group | 
+------+------+----------+ 
| 1 | US |  4 | 
| 2 | IE | 2,4,6 | 
| 3 | DE | 3,7 | 
| 4 | SG | 2,4,6 | 
| 5 | FR |  5 | 
| 6 | UK | 2,4,6 | 
| 7 | AT | 3,7 | 
+------+------+----------+ 

我迄今为止最好的尝试以下,而且在sqlfiddle链接显示,但分组排除了一些ISO。我需要返回的每一行

SELECT iso, language_id, GROUP_CONCAT(id) as id 
FROM countries 
GROUP BY language_id 

http://sqlfiddle.com/#!9/907618/3

可以这样使用MySQL来完成或者我将需要运行许多语句,得到的结果?

感谢

+0

个人而言,我不会在MySQL中进行连接部分,但无论哪种方式,都可以非常容易地完成。这只是一个联接。 – Strawberry

+0

你能否详细说明一下。正如我所说,这是我最好的尝试。谢谢 – Typhoon101

+0

您的最佳尝试没有加入。试试加入。你可能无法解决这个问题几乎是不可能的。 – Strawberry

回答

2

这个查询将返回每种语言ID的所有ID:

select language_id, GROUP_CONCAT(id ORDER BY id) as id_group 
from countries 
group by language_id 

,那么你只需要加入这个查询与国家表:

select 
    c.id, 
    c.iso, 
    g.id_group 
from 
    countries c inner join (
    select language_id, GROUP_CONCAT(id ORDER BY id) as id_group 
    from countries 
    group by language_id 
) g on c.language_id = g.language_id 
order by 
    c.id 

没有一个子查询你可以使用自加入:

select 
    c.id, 
    c.iso, 
    group_concat(c1.id order by c1.id) as id_group 
from 
    countries c inner join countries c1 
    on c.language_id = c1.language_id 
group by 
    c.id, 
    c.iso 
+0

这里不需要子查询。一个JOIN就足够了。 – Strawberry

+0

@Strawberry是的,这是真的,但我认为子查询更清晰,更易于理解 – fthiella

+0

也许我们可以同意不同意。 – Strawberry