MariaDB má GROUP_CONCAT()
funkce, která nám umožňuje vrátit sloupce z dotazu jako oddělovaný seznam.
Syntaxe
Syntaxe vypadá takto:
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}])
Příklad
Předpokládejme, že spustíme následující dotaz:
SELECT PetName
FROM Pets;
A dostaneme následující výsledek:
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set (0.001 sec)
Můžeme použít GROUP_CONCAT()
vrátit všechny tyto řádky jako seznam s oddělovači.
Abychom toho dosáhli, vše, co musíme udělat, je předat PetName
sloupec jako argument pro GROUP_CONCAT()
funkce:
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Výsledek:
+-------------------------------------------------+ | GROUP_CONCAT(PetName) | +-------------------------------------------------+ | Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow | +-------------------------------------------------+ 1 row in set (0.003 sec)
Objednávání
Můžeme použít ORDER BY
klauzule k objednání výstupu této funkce:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC)
FROM Pets;
Výsledek:
Wag,Tweet,Scratch,Meow,Fluffy,Fluffy,Fetch,Bark
Všimněte si, že toto třídí pouze výstup GROUP_CONCAT()
funkce – je zcela nezávislá na jakémkoli řazení použitém na SELECT
samotné prohlášení.
Omezení výstupu
Můžeme použít LIMIT
klauzule omezující počet položek zahrnutých v seznamu:
SELECT GROUP_CONCAT(PetName LIMIT 3)
FROM Pets;
Výsledek:
Fluffy,Fetch,Scratch
Jakákoli objednávka se použije před LIMIT
klauzule:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC LIMIT 3)
FROM Pets;
Výsledek:
Wag,Tweet,Scratch
Všimněte si, že LIMIT
klauzule je podporována pouze od MariaDB 10.3.3.
DISTINCT
Ustanovení
Můžeme použít DISTINCT
klauzule pro vrácení jedinečných hodnot. Jinými slovy, pokud existují duplicitní hodnoty, je vrácen pouze jeden výskyt:
SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
FROM Pets;
Výsledek:
Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag
V tomto případě Fluffy
se objeví pouze jednou. Když jej spustíme bez DISTINCT
klauzule, Fluffy
se objeví dvakrát.
Změna oddělovače
Ve výchozím nastavení seznam používá jako oddělovač čárku. Ale můžeme to změnit, pokud chceme:
SELECT GROUP_CONCAT(PetName SEPARATOR '-')
FROM Pets;
Výsledek:
Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow
Můžeme dokonce použít prázdný řetězec k odstranění všech oddělovačů (takže hodnoty jsou zřetězené):
SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets;
A dostaneme následující výsledek:
FluffyFetchScratchWagTweetFluffyBarkMeow
Výsledky seskupených dotazů
Můžeme zahrnout GROUP_CONCAT()
v dotazu s GROUP BY
klauzule k dosažení výsledku, jako je tento:
SELECT
PetTypeId,
GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;
Výsledek:
+-----------+--------------------------------------------+ | PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) | +-----------+--------------------------------------------+ | 1 | Tweet | | 2 | Fluffy,Meow,Scratch | | 3 | Bark,Fetch,Fluffy,Wag | +-----------+--------------------------------------------+
V mé databázi jsou skutečná jména typů mazlíčků v jiné tabulce nazvané PetTypes
. Mohli bychom tedy spustit INNER JOIN
na PetTypes
tabulka pro získání skutečných jmen typu domácího mazlíčka:
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;
Výsledek:
+---------+------------------------------------------------+ | PetType | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) | +---------+------------------------------------------------+ | Bird | Tweet | | Cat | Fluffy,Meow,Scratch | | Dog | Bark,Fetch,Fluffy,Wag | +---------+------------------------------------------------+
Omezení délky
Maximální vrácená délka v bajtech je určena group_concat_max_len
serverová systémová proměnná, která má výchozí hodnotu 1M (v MariaDB 10.2.4 a vyšší) nebo 1K (v MariaDB 10.2.3 a nižší). Pokud group_concat_max_len
je 512
nebo nižší, návratový typ je VARBINARY
nebo VARCHAR
; jinak je návratový typ BLOB
nebo TEXT
. Volba mezi binárním nebo nebinárním typem závisí na vstupu.
Aktuální hodnotu můžete zkontrolovat takto:
SHOW VARIABLES LIKE '%group_concat%';
Syntaxe pro změnu této hodnoty je následující:
SET [GLOBAL | SESSION] group_concat_max_len = val;
Kde val
je celé číslo bez znaménka.