MariaDB heeft een GROUP_CONCAT()
functie waarmee we kolommen uit een query kunnen retourneren als een begrensde lijst.
Syntaxis
De syntaxis gaat als volgt:
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}])
Voorbeeld
Stel dat we de volgende query uitvoeren:
SELECT PetName
FROM Pets;
En we krijgen het volgende resultaat:
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+ 8 rows in set (0.001 sec)
We kunnen GROUP_CONCAT()
. gebruiken om al die rijen terug te geven als een lijst met scheidingstekens.
Om dit te bereiken, hoeven we alleen de PetName
. door te geven kolom als argument voor de GROUP_CONCAT()
functie:
SELECT GROUP_CONCAT(PetName)
FROM Pets;
Resultaat:
+-------------------------------------------------+ | GROUP_CONCAT(PetName) | +-------------------------------------------------+ | Fluffy,Fetch,Scratch,Wag,Tweet,Fluffy,Bark,Meow | +-------------------------------------------------+ 1 row in set (0.003 sec)
Bestellen
We kunnen de ORDER BY
. gebruiken clausule om de uitvoer van deze functie te bestellen:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC)
FROM Pets;
Resultaat:
Wag,Tweet,Scratch,Meow,Fluffy,Fluffy,Fetch,Bark
Merk op dat dit alleen de uitvoer van de GROUP_CONCAT()
. sorteert functie – het is volledig onafhankelijk van elke volgorde die wordt toegepast op de SELECT
verklaring zelf.
De uitvoer beperken
We kunnen de LIMIT
. gebruiken clausule om het aantal items in de lijst te beperken:
SELECT GROUP_CONCAT(PetName LIMIT 3)
FROM Pets;
Resultaat:
Fluffy,Fetch,Scratch
Elke bestelling wordt toegepast vóór de LIMIT
clausule:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC LIMIT 3)
FROM Pets;
Resultaat:
Wag,Tweet,Scratch
Merk op dat de LIMIT
clausule wordt alleen ondersteund vanuit MariaDB 10.3.3.
De DISTINCT
Clausule
We kunnen de DISTINCT
. gebruiken clausule om unieke waarden te retourneren. Met andere woorden, als er dubbele waarden zijn, wordt slechts één exemplaar geretourneerd:
SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
FROM Pets;
Resultaat:
Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag
In dit geval Fluffy
verschijnt maar één keer. Wanneer we het uitvoeren zonder de DISTINCT
clausule, Fluffy
verschijnt twee keer.
Het scheidingsteken wijzigen
Standaard gebruikt de lijst de komma als scheidingsteken. Maar we kunnen dit veranderen als we willen:
SELECT GROUP_CONCAT(PetName SEPARATOR '-')
FROM Pets;
Resultaat:
Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow
We kunnen zelfs een lege string gebruiken om alle scheidingstekens te verwijderen (zodat de waarden aaneengeschakeld worden):
SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets;
En we krijgen het volgende resultaat:
FluffyFetchScratchWagTweetFluffyBarkMeow
Gegroepeerde zoekopdrachtresultaten
We kunnen GROUP_CONCAT()
. opnemen in een zoekopdracht met een GROUP BY
clausule om een resultaat als dit te bereiken:
SELECT
PetTypeId,
GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId;
Resultaat:
+-----------+--------------------------------------------+ | PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) | +-----------+--------------------------------------------+ | 1 | Tweet | | 2 | Fluffy,Meow,Scratch | | 3 | Bark,Fetch,Fluffy,Wag | +-----------+--------------------------------------------+
In mijn database staan de daadwerkelijke namen van huisdiertypes in een andere tabel genaamd PetTypes
. We zouden daarom een INNER JOIN
. kunnen uitvoeren op de PetTypes
tabel om de werkelijke namen van huisdiertypes te krijgen:
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;
Resultaat:
+---------+------------------------------------------------+ | PetType | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) | +---------+------------------------------------------------+ | Bird | Tweet | | Cat | Fluffy,Meow,Scratch | | Dog | Bark,Fetch,Fluffy,Wag | +---------+------------------------------------------------+
Lengtebeperkingen
De maximale geretourneerde lengte in bytes wordt bepaald door de group_concat_max_len
serversysteemvariabele, die standaard is ingesteld op 1M (in MariaDB 10.2.4 en hoger) of 1K (in MariaDB 10.2.3 en lager). Als group_concat_max_len
is 512
of lager, het retourtype is VARBINARY
of VARCHAR
; anders is het retourtype BLOB
of TEXT
. De keuze tussen binaire of niet-binaire typen hangt af van de invoer.
U kunt de huidige waarde als volgt controleren:
SHOW VARIABLES LIKE '%group_concat%';
De syntaxis voor het wijzigen van deze waarde gaat als volgt:
SET [GLOBAL | SESSION] group_concat_max_len = val;
Waar val
is een geheel getal zonder teken.