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

MySQLのGROUP_CONCAT()関数

    MySQLにはGROUP_CONCAT()があります クエリから列を区切りリストとして返すことができる関数。

    NULL以外を連結した文字列の結果を返します グループからの値。

    構文

    構文は次のようになります:

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

    次のクエリを実行するとします。

    SELECT PetName 
    FROM Pets;

    そして、次の結果が得られます:

    +---------+
    | PetName |
    +---------+
    | Fluffy  |
    | Fetch   |
    | Scratch |
    | Wag     |
    | Tweet   |
    | Fluffy  |
    | Bark    |
    | Meow    |
    +---------+
    8 rows in set (0.00 sec)

    GROUP_CONCAT()を使用できます これらのすべての行を区切りリストとして返します。

    これを行うには、PetNameを渡す必要があります GROUP_CONCAT()への引数としての列 機能:

    SELECT GROUP_CONCAT(PetName) 
    FROM Pets;

    結果:

    +-------------------------------------------------+
    | GROUP_CONCAT(PetName)                           |
    +-------------------------------------------------+
    | Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow |
    +-------------------------------------------------+
    1 row in set (0.01 sec)

    注文

    ORDER BYを使用できます この関数の出力を順序付ける句:

    SELECT GROUP_CONCAT(PetName ORDER BY PetName ASC)
    FROM Pets;

    結果:

    Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag

    これは、GROUP_CONCAT()の出力のみをソートすることに注意してください 関数– SELECTに適用される順序とは完全に独立しています ステートメント自体。

    DISTINCT 条項

    DISTINCTを使用できます 一意の値を返す句。つまり、重複する値がある場合、1つのオカレンスのみが返されます:

    SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
    FROM Pets;

    結果:

    Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag

    この場合、Fluffy 一度だけ表示されます。 DISTINCTなしで実行した場合 句、Fluffy 2回表示されます。

    セパレーターの交換

    デフォルトでは、リストは区切り文字としてコンマを使用します。ただし、必要に応じてこれを変更できます:

    SELECT GROUP_CONCAT(PetName SEPARATOR '-')
    FROM Pets;

    結果:

    Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow

    空の文字列を使用して、すべての区切り文字を削除することもできます(値が連結されるように):

    SELECT GROUP_CONCAT(PetName SEPARATOR '')
    FROM Pets;

    そして、次の結果が得られます:

    FluffyFetchScratchWagTweetFluffyBarkMeow

    グループ化されたクエリ結果

    GROUP_CONCAT()を含めることができます GROUP BYを使用したクエリで 次のような結果を達成するための句:

    SELECT 
        PetTypeId,
        GROUP_CONCAT(PetName ORDER BY PetName ASC)
    FROM Pets
    GROUP BY PetTypeId
    ORDER BY PetTypeId;

    結果:

    +-----------+--------------------------------------------+
    | PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) |
    +-----------+--------------------------------------------+
    |         1 | Tweet                                      |
    |         2 | Fluffy,Meow,Scratch                        |
    |         3 | Bark,Fetch,Fluffy,Wag                      |
    +-----------+--------------------------------------------+

    私のデータベースでは、実際のペットの種類の名前はPetTypesという別のテーブルにあります 。したがって、INNER JOINを実行できます。 PetTypesで 実際のペットの種類の名前を取得するための表:

    SELECT 
        pt.PetType,
        GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC)
    FROM Pets p
    INNER JOIN PetTypes pt ON
    p.PetTypeId = pt.PetTypeId
    GROUP BY pt.PetType
    ORDER BY pt.PetType ASC;

    結果:

    +---------+------------------------------------------------+
    | PetType | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) |
    +---------+------------------------------------------------+
    | Bird    | Tweet                                          |
    | Cat     | Fluffy,Meow,Scratch                            |
    | Dog     | Bark,Fetch,Fluffy,Wag                          |
    +---------+------------------------------------------------+

    長さの制限

    GROUP_CONCAT() の出力は、group_concat_max_lenで指定された最大長に切り捨てられます。 システム変数。デフォルト値は1024です。 。戻り値の有効な最大長はmax_allowed_packetの値によって制約されますが、値を高く設定することもできます。 。

    次のように現在の値を確認できます:

    SHOW VARIABLES LIKE '%group_concat%';

    この値を変更するための構文は次のとおりです。

    SET [GLOBAL | SESSION] group_concat_max_len = val;

    valの場所 符号なし整数です。


    1. MacOSXのPHPでPostgreSQLサポートを有効にする

    2. postgresqlでvarchar列を列挙型にアップグレードする

    3. PyInstaller、スペックファイル、ImportError:「blah」という名前のモジュールがありません

    4. Linux / WindowsでPgBouncerログをローテーションする方法は?