GROUP_CONCAT(expr)

完全な構文

GROUP_CONCAT([DISTINCT] expr [,expr …]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col …]]
[SEPARATOR str_val])
この関数は MySQL バージョン 4.1 で追加された。 この関数はグループ内の値を連結した結果の文字列を返す。

(例1)

SELECT C.Name,count(*) as nlanguages,GROUP_CONCAT(Language)
FROM Country C,CountryLanguage CL
WHERE CL.IsOfficial = 'T'
AND CL.CountryCode = C.Code
group by C.Name
order by nlanguages
desc limit 3;

group_concat

ちなみに、GROUP_CONCATを利用しないと以下のようになる。

group_concat_no

MySQL では、式の組み合わせの連結値を得ることができる。 DISTINCT を使用することで、
重複する値は排除できる。 結果の値をソートするには、ORDER BY 節を使用する。
逆の順序でソートするには、ORDER BY 節でソートキーとするカラムの名前に DESC(降順)キーワードを付ける。
デフォルトは昇順だが、昇順を明示的に指定するには、ASC キーワードを指定する。
SEPARATOR は結果の値と値の間に挿入する文字列値を表す。デフォルトはカンマ('”,”‘)。
区切り記号をまったく使用しない場合は、SEPARATOR “” と指定する。

使用可能な最大長は、変数 group_concat_max_len をオプション設定ファイルに記述することで設定できる。
設定を SQL クエリで行う構文は次のとおり。
SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer;
最大長が設定されている場合、結果はこの最大長に合わせて切り捨てられる。

group_concat_max_len

(例2)

select CountryCode,Group_Concat(Language)
from CountryLanguage where
CountryCode ='JPN';

group_concat_sample1


select CountryCode,Language
from CountryLanguage where
CountryCode ='JPN';

group_concat_sample2_no

参考サイト
6.3.7.1. GROUP BY 関数


GROUP_CONCAT、サブクエリーを利用してデータの抽出を行い
CONCATを用いて文字列を連結する。

CONCAT(str1,str2,…)

引数を連結した結果であるストリングを戻します。ひとつ以上の引数を持つ場合があります。
すべての引数が非バイナリ ストリングである場合、結果は非バイナリ ストリングになります。
引数がひとつでもバイナリ ストリングを含む場合は、結果はバイナリ ストリングになります。
数値の引数はそれに等しいバイナリ ストリング形態に変換されます。それを避けたい場合は、
次の例のように、明示的なタイプ キャストを使用することができます :

SELECT CONCAT(CAST(int_col AS CHAR), char_col);

サンプルテーブル
sample

サンプルデータ
sample_data

上記のテーブルからオフィシャル言語が多い国を抽出してみる。


select B.NAME,Count(*) SUM from
CountryLanguage A,Country B
where A.CountryCode = B.Code
AND A.ISOfficial = 'T'
GROUP BY B.Name
Order by SUM desc
limit 1;

select_official

select B.NAME,Count(*) SUM,
GROUP_CONCAT(Language) LANG
from CountryLanguage A,Country B
where A.CountryCode = B.Code
AND A.ISOfficial = 'T'
GROUP BY B.Name
ORDER BY SUM DESC
limit 1;

gc1


SELECT TMP.NAME,TMP.SUM,TMP.LANG FROM
(
select B.NAME,Count(*) SUM,
GROUP_CONCAT(Language) LANG
from CountryLanguage A,Country B
where A.CountryCode = B.Code
AND A.ISOfficial = 'T'
GROUP BY B.Name
ORDER BY SUM DESC
limit 1
) AS TMP;

gc2

上記結果をCONCATで結合して文言にする。

SELECT
CONCAT(
'The country ',
(SELECT Name FROM (
SELECT Name, COUNT(*) AS nlanguages,
GROUP_CONCAT(Language) as languages
FROM Country c, CountryLanguage cl
WHERE c.Code = cl.CountryCode
AND cl.IsOfficial = 'T'
GROUP BY Name
ORDER BY nlanguages DESC, Name
LIMIT 1
) AS tmp
),
' has ',
(SELECT nlanguages FROM (
SELECT Name, COUNT(*) AS nlanguages,
GROUP_CONCAT(Language) as languages
FROM Country c, CountryLanguage cl
WHERE c.Code = cl.CountryCode
AND cl.IsOfficial = 'T'
GROUP BY Name
ORDER BY nlanguages DESC, Name
LIMIT 1
) AS tmp1
),
' official languages: ',
(SELECT languages FROM (
SELECT Name, COUNT(*) AS nlanguages,
GROUP_CONCAT(Language) as languages
FROM Country c, CountryLanguage cl
WHERE c.Code = cl.CountryCode
AND cl.IsOfficial = 'T'
GROUP BY Name
ORDER BY nlanguages DESC, Name
LIMIT 1
) AS tmp2
)
) AS '文字の結合';

concat_sentenct

参考サイト
11.11.1. GROUP BY (Aggregate) Functions


11.3. 文字列関数


GROUP_CONCAT()

この関数は、グループからの連結された非 NULL 値を伴うストリング結果を戻します。
非 NULL 値がない場合は NULL を戻します。

GROUP_CONCAT() によって戻されるタイプは、group_concat_max_len が 512
より大きい場合意外は常に VARCHAR になります。512 を越える場合は BLOB になります。

GROUP_CONCAT([DISTINCT] expr [,expr …]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name …]]
[SEPARATOR str_val])


mysql> select
-> TABLE_SCHEMA,TABLE_NAME
-> from information_schema.TABLES
-> where TABLE_SCHEMA = 'test';
+--------------+----------------+
| TABLE_SCHEMA | TABLE_NAME |
+--------------+----------------+
| test | A10 |
| test | T10 |
| test | a10 |
| test | innodb_monitor |
| test | innodbtable |
| test | t10 |
+--------------+----------------+
6 rows in set (0.00 sec)

mysql> select
-> TABLE_SCHEMA,
-> GROUP_CONCAT(TABLE_NAME SEPARATOR '/')
-> from information_schema.TABLES
-> where TABLE_SCHEMA = 'test';
+--------------+--------------------------------------------+
| TABLE_SCHEMA | GROUP_CONCAT(TABLE_NAME SEPARATOR '/') |
+--------------+--------------------------------------------+
| test | A10/T10/a10/innodb_monitor/innodbtable/t10 |
+--------------+--------------------------------------------+
1 row in set (0.00 sec)

group_concat1

    参考サイト

11.11.1. GROUP BY ( 集約 ) 関数