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