2016-11-18 41 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