MySQLでは、GROUP_CONCAT()
を使用して、クエリ結果をコンマ区切りのリストとして返すことができます。 機能。
GROUP_CONCAT()
関数は、クエリの結果セットを、コンマまたは選択した区切り文字で区切られたリストに連結することを目的として特別に構築されました。
この記事では、すべてがどのように機能するかの例を示します。
データ
まず、最初のいくつかの例で次のデータを使用しましょう。
USE Solutions; SELECT TaskName FROM Tasks;
結果:
+-------------------+ | TaskName | +-------------------+ | Do garden | | Feed cats | | Paint roof | | Take dog for walk | | Relax | | Feed cats | +-------------------+
基本的な例
GROUP_CONCAT()
を示す基本的な例を次に示します。 機能:
SELECT GROUP_CONCAT(TaskName) FROM Tasks;
結果:
+------------------------------------------------------------------+ | GROUP_CONCAT(TaskName) | +------------------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats | +------------------------------------------------------------------+
ご覧のとおり、結果セットの各行は1つの行に連結されています。デフォルトでは、リストはコンマで区切られています。
このリストの長さには制限があることに注意してください。これについては、記事の後半で詳しく説明します。
例– DISTINCT
DISTINCT
を使用できます 重複を削除します(重複レコードが1つのレコードになるようにします)。
例:
SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;
結果:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName) | +--------------------------------------------------------+ | Do garden,Feed cats,Paint roof,Relax,Take dog for walk | +--------------------------------------------------------+
したがって、この場合、「猫に餌をやる」は1回だけリストされますが、前の例では2回リストされています。
例– ORDER BY
ORDER BY
を使用できます 結果を特定の列で並べ替えます。
例:
SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) FROM Tasks;
結果:
+--------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) | +--------------------------------------------------------+ | Take dog for walk,Relax,Paint roof,Feed cats,Do garden | +--------------------------------------------------------+
したがって、この場合はDESC
を使用します 降順であることを指定します。代替(およびデフォルト)値はASC
です 昇順。
例–区切り文字を指定する
デフォルトでは、リストはコンマ区切りのリストです。ただし、必要に応じて、選択した区切り文字を指定できます。
これを行うには、SEPARATOR
を使用します その後に、グループ値の間に挿入する必要のある文字列リテラル値が続きます。
例:
SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') FROM Tasks;
結果:
+----------------------------------------------------------------+ | GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') | +----------------------------------------------------------------+ | Do garden + Feed cats + Paint roof + Relax + Take dog for walk | +----------------------------------------------------------------+
例–列の組み合わせ
列を連結し、文字列リテラル値を提供することで独自の区切り文字を提供することもできます。
例:
SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') FROM Tasks;
結果:
+------------------------------------------------------------------------------------+ | GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') | +------------------------------------------------------------------------------------+ | 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats | +------------------------------------------------------------------------------------+
この例では、両方のTaskId
を返します。 列とTaskName
列。閉じ括弧とスペースで区切られます。 SEPARATOR
も使用します 各(連結された)行の間に使用される区切り文字が(デフォルトのコンマではなく)スペースであることを指定する引数。
グループ化された結果
GROUP_CONCAT()
関数は、別の列でグループ化された結果のリストを提供する場合に役立ちます。
たとえば、アーティストのリストが必要な場合があります。各アーティストの後に、リリースしたアルバムのリストが続きます。
これを実証するために、2つのテーブルを持つデータベースがあるとします。 Artists
およびAlbums
。これらのテーブルの間には1対多の関係があります。すべてのアーティストにとって、多くのアルバムが存在する可能性があります。
したがって、両方のテーブルを結合する通常のクエリは次のようになります。
USE Music; SELECT ar.ArtistName, al.AlbumName FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId;
結果:
+------------------------+--------------------------+ | ArtistName | AlbumName | +------------------------+--------------------------+ | Iron Maiden | Powerslave | | AC/DC | Powerage | | Jim Reeves | Singing Down the Lane | | Devin Townsend | Ziltoid the Omniscient | | Devin Townsend | Casualties of Cool | | Devin Townsend | Epicloud | | Iron Maiden | Somewhere in Time | | Iron Maiden | Piece of Mind | | Iron Maiden | Killers | | Iron Maiden | No Prayer for the Dying | | The Script | No Sound Without Silence | | Buddy Rich | Big Swing Face | | Michael Learns to Rock | Blue Night | | Michael Learns to Rock | Eternity | | Michael Learns to Rock | Scandinavia | | Tom Jones | Long Lost Suitcase | | Tom Jones | Praise and Blame | | Tom Jones | Along Came Jones | | Allan Holdsworth | All Night Wrong | | Allan Holdsworth | The Sixteen Men of Tain | +------------------------+--------------------------+
ご覧のとおり、この形式を使用する場合、アーティストに複数のアルバムがある場合、そのアーティストは複数回(アルバムごとに1回)リストされます。
このクエリを変更して、各アーティストが1回だけリストされるようにすることができます。アーティストが複数のアルバムを持っている場合、すべてのアルバムはコンマで区切られたリスト内の1つのフィールドに表示されます。 GROUP_CONCAT()
のおかげでこれを行うことができます 機能。
例:
USE Music; SELECT ar.ArtistName, GROUP_CONCAT(al.AlbumName) FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
結果:
+------------------------+----------------------------------------------------------------------------+ | ArtistName | GROUP_CONCAT(al.AlbumName) | +------------------------+----------------------------------------------------------------------------+ | AC/DC | Powerage | | Allan Holdsworth | All Night Wrong,The Sixteen Men of Tain | | Buddy Rich | Big Swing Face | | Devin Townsend | Epicloud,Ziltoid the Omniscient,Casualties of Cool | | Iron Maiden | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying | | Jim Reeves | Singing Down the Lane | | Michael Learns to Rock | Eternity,Scandinavia,Blue Night | | The Script | No Sound Without Silence | | Tom Jones | Long Lost Suitcase,Praise and Blame,Along Came Jones | +------------------------+----------------------------------------------------------------------------+
長さに注意してください!
GROUP_CONCAT()
を使用する際に注意する必要がある重要なことの1つ 結果は、group_concat_max_len
によって提供される最大長に切り捨てられます。 システム変数。デフォルト値は1024
です。 。
この変数の値は、次の構文を使用して高く設定できます。
SET [GLOBAL | SESSION] group_concat_max_len = val;
val
の場所 符号なし整数です。
ただし、戻り値の有効な最大長自体は、max_allowed_packet
の値によって制約されることに注意してください。 。