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.