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

MariaDB GROUP_CONCAT()

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

    構文

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

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

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

    SELECT PetName 
    FROM Pets;

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

    +---------+
    | PetName |
    +---------+
    | Fluffy  |
    | Fetch   |
    | Scratch |
    | Wag     |
    | Tweet   |
    | Fluffy  |
    | Bark    |
    | Meow    |
    +---------+
    8 rows in set (0.001 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.003 sec)

    注文

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

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

    結果:

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

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

    出力の制限

    LIMITを使用できます リストに含まれるアイテムの数を制限する句:

    SELECT GROUP_CONCAT(PetName LIMIT 3)
    FROM Pets;

    結果:

    Fluffy,Fetch,Scratch

    LIMITの前にすべての順序が適用されます 条項:

    SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC LIMIT 3)
    FROM Pets;

    結果:

    Wag,Tweet,Scratch

    LIMITに注意してください 句はMariaDB10.3.3からのみサポートされています。

    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_max_lenによって決定されます。 サーバーシステム変数。デフォルトは1M(MariaDB 10.2.4以降)または1K(MariaDB 10.2.3以下)です。 group_concat_max_lenの場合 512です 以下の場合、戻りタイプはVARBINARYです。 またはVARCHAR;それ以外の場合、戻りタイプはBLOBです。 またはTEXT 。バイナリタイプと非バイナリタイプのどちらを選択するかは、入力によって異なります。

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

    SHOW VARIABLES LIKE '%group_concat%';

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

    SET [GLOBAL | SESSION] group_concat_max_len = val;

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


    1. MySQLはORDERBYで行の位置を取得します

    2. CentOS /RHEL7およびDebianシステムでMariaDB5.5をMariaDB10.1にアップグレードする方法

    3. MySQLのデフォルトの制約名は何ですか?

    4. postgresqlでJSONを解析する方法