sql >> Database teknologi >  >> RDS >> MariaDB

MariaDB GROUP_CONCAT()

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 JOINPetTypes 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.


  1. Opret en tabel i MySQL

  2. Sådan konverteres til store bogstaver i MariaDB

  3. Beregn en løbende total i MySQL

  4. Forespørgsel for at hente alle rækker fra forrige måned