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