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の場所 符号なし整数です。