MariaDB har en GROUP_CONCAT()
funktion, der gør det muligt for os at returnere kolonner fra en forespørgsel som en afgrænset liste.
Syntaks
Syntaksen ser sådan ud:
GROUP_CONCAT([DISTINCT] udtr [,udtr ...] [ORDER BY {usigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val] [LIMIT {[ offset,] row_count | row_count OFFSET offset}])
Eksempel
Antag, at vi kører følgende forespørgsel:
VÆLG PetName FROM Pets;
Og vi får følgende resultat:
+--------+| Kæledyrsnavn |+--------+| Fluffy || Hent || Ridse || Wag || Tweet || Fluffy || Bark || Mjau |+---------+8 rækker i sæt (0,001 sek.)
Vi kan bruge GROUP_CONCAT()
for at returnere alle disse rækker som en afgrænset liste.
For at opnå dette skal vi blot videregive PetName
kolonne som et argument til GROUP_CONCAT()
funktion:
VÆLG GROUP_CONCAT(PetName) FROM Pets;
Resultat:
+---------------------------------------------- ---+| GROUP_CONCAT(PetName) |+---------------------------------------------------- -----+| Fluffy, Fetch, Scratch, Wag, Tweet, Fluffy, Bark, Meow |+---------------------------------------- ----------------+1 række i sæt (0,003 sek.)
Bestilling
Vi kan bruge ORDER BY
klausul for at bestille output af denne funktion:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC)FROM Pets;
Resultat:
Wag, Tweet, Scratch, Meow, Fluffy, Fluffy, Fetch, Bark
Bemærk, at dette kun sorterer output fra GROUP_CONCAT()
funktion – den er fuldstændig uafhængig af enhver bestilling, der anvendes på SELECT
selve erklæringen.
Begrænsning af output
Vi kan bruge LIMIT
klausul for at begrænse, hvor mange elementer der er inkluderet på listen:
SELECT GROUP_CONCAT(PetName LIMIT 3)FROM Pets;
Resultat:
Fluffy,Fetch,Scratch
Enhver bestilling anvendes inden LIMIT
klausul:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC LIMIT 3)FROM Pets;
Resultat:
Wag, Tweet, Scratch
Bemærk, at LIMIT
klausul er kun understøttet fra MariaDB 10.3.3.
DISTINCT
Klausul
Vi kan bruge DISTINCT
klausul for at returnere unikke værdier. Med andre ord, hvis der er duplikerede værdier, returneres kun én forekomst:
SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)FROM Pets;
Resultat:
Bark,Fetch,Fluffy,Meow,Scratch,Tweet,Wag
I dette tilfælde Fluffy
vises kun én gang. Når vi kører det uden DISTINCT
klausul, Fluffy
vises to gange.
Ændring af separatoren
Som standard bruger listen kommaet som skilletegn. Men vi kan ændre dette, hvis vi vil:
SELECT GROUP_CONCAT(PetName SEPARATOR '-')FROM Pets;
Resultat:
Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Meow
Vi kan endda bruge en tom streng til at fjerne alle separatorer (så værdierne er sammenkædet):
SELECT GROUP_CONCAT(PetName SEPARATOR '')FROM Pets;
Og vi får følgende resultat:
FluffyFetchScratchWagTweetFluffyBarkMeow
Resultater af grupperet forespørgsel
Vi kan inkludere GROUP_CONCAT()
i en forespørgsel med en GROUP BY
klausul for at opnå et resultat som dette:
VÆLG PetTypeId, GROUP_CONCAT(PetName ORDER BY PetName ASC)FROM PetsGROUP BY PetTypeIdORDER BY PetTypeId;
Resultat:
+------+--------------------------------- ----------+| PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) |+-----------+----------------------------------- ----------------+| 1 | Tweet || 2 | Fluffy,Meow,Scratch || 3 | Bark,Fetch,Fluffy,Wag |+-----------+------------------------------------ ---------------+
I min database er de faktiske kæledyrstypenavne i en anden tabel kaldet PetTypes
. Vi kunne derfor køre en INNER JOIN
på PetTypes
tabel for at få de faktiske kæledyrstypenavne:
SELECT pt.PetType, GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC)FROM Pets pinNER JOIN PetTypes pt ONp.PetTypeId =pt.PetTypeIdGROUP BY pt.PetTypeORDER BY pt.PetTypet;
Resultat:
+--------+-------------------------------------------- ------------+| PetType | GROUP_CONCAT(s.PetName ORDER BY p.PetName ASC) |+--------+-------------------------------- ----------------------+| Fugl | Tweet || Kat | Fluffy,Meow,Scratch || Hund | Bark,Fetch,Fluffy,Wag |+--------+-------------------------------------- ------------------+
Længdebegrænsninger
Den maksimale returnerede længde i bytes bestemmes af group_concat_max_len
serversystemvariabel, som som standard er 1M (i MariaDB 10.2.4 og nyere) eller 1K (i MariaDB 10.2.3 og lavere). Hvis group_concat_max_len
er 512
eller lavere, returtypen er VARBINARY
eller VARCHAR
; ellers er returtypen BLOB
eller TEKST
. Valget mellem binære eller ikke-binære typer afhænger af inputtet.
Du kan kontrollere den aktuelle værdi på denne måde:
VIS VARIABLER SOM '%group_concat%';
Syntaksen for at ændre denne værdi er som følger:
INDSTIL [GLOBAL | SESSION] group_concat_max_len =val;
Hvor val
er et heltal uden fortegn.