2016-11-18 9 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  | 
+------+------+-------------+ 

はEVERY ISOを含む結果セットを返しますMySQLの声明やIDSどこを連結した文字列であります言語IDは、上記の例ではそう

と一致し、私は以下とsqlfiddleのリンクに示され、これまで

+------+------+----------+ 
| 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 | 
+------+------+----------+ 

私の最高の試みを取得するために探していますグループ分けは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

最高の試行には参加していません。 JOINを試してみてください。あなたがこれを解決できないことはほとんど不可能です。 – 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