sql >> データベース >  >> RDS >> Mysql

MySQLでクエリ結果をコンマ区切りリストとして返す方法

    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の値によって制約されることに注意してください。 。


    1. T-SQLで昨日の日付を取得する方法

    2. 拡張イベントでの述語注文の問題

    3. SQL ServerでのCAST()のしくみ

    4. T-SQLを使用してSQLServerデータベースのリカバリモデルを変更する方法