MySQL heeft een GROUP_CONCAT()
functie waarmee we kolommen uit een query kunnen retourneren als een begrensde lijst.
Het retourneert een tekenreeksresultaat met de aaneengeschakelde niet-NULL
waarden van een groep.
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])
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.00 sec)
We kunnen GROUP_CONCAT()
. gebruiken om al die rijen terug te geven als een lijst met scheidingstekens.
Om dit te doen, moeten we de PetName
. doorgeven 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.01 sec)
Bestellen
We kunnen de ORDER BY
. gebruiken clausule om de uitvoer van deze functie te bestellen:
SELECT GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets;
Resultaat:
Bark,Fetch,Fluffy,Fluffy,Meow,Scratch,Tweet,Wag
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 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
GROUP_CONCAT()
's output wordt afgekapt tot de maximale lengte die wordt gegeven door de group_concat_max_len
systeemvariabele, die een standaardwaarde heeft van 1024
. De waarde kan hoger worden ingesteld, hoewel de effectieve maximale lengte van de retourwaarde wordt beperkt door de waarde van max_allowed_packet
.
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.