Mysql
 sql >> Datenbank >  >> RDS >> Mysql

GROUP_CONCAT()-Funktion in MySQL

MySQL hat ein GROUP_CONCAT() Funktion, die es uns ermöglicht, Spalten aus einer Abfrage als begrenzte Liste zurückzugeben.

Es gibt ein String-Ergebnis mit dem verketteten Nicht-NULL zurück Werte aus einer Gruppe.

Syntax

Die Syntax lautet wie folgt:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val]) 

Beispiel

Angenommen, wir führen die folgende Abfrage aus:

SELECT PetName 
FROM Pets; 

Und wir erhalten das folgende Ergebnis:

+---------+| Tiername |+---------+| Flauschig || || holen Kratzer || Wag || Twittern || Flauschig || Rinde || Miau |+---------+8 Zeilen im Satz (0,00 Sek.)

Wir können GROUP_CONCAT() verwenden alle diese Zeilen als Liste mit Trennzeichen zurückzugeben.

Dazu müssen wir den PetName übergeben Spalte als Argument für GROUP_CONCAT() Funktion:

SELECT GROUP_CONCAT(PetName) 
FROM Pets; 

Ergebnis:

+---------------------------------------------- ---+| GROUP_CONCAT(Tiername) |+----------------------------------------------------- -----+| Flauschig, Apportieren, Kratzen, Wedeln, Twittern, Flauschig, Bellen, Miau |+-------------------------------- ----------------+1 Zeile im Satz (0,01 Sek.)

Bestellung

Wir können den ORDER BY verwenden -Klausel, um die Ausgabe dieser Funktion anzuordnen:

SELECT GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets; 

Ergebnis:

bellen, holen, flauschig, flauschig, miauen, kratzen, twittern, wedeln

Beachten Sie, dass dies nur die Ausgabe von GROUP_CONCAT() sortiert Funktion – sie ist völlig unabhängig von der Reihenfolge, die auf SELECT angewendet wird Aussage selbst.

Der DISTINCT Klausel

Wir können den DISTINCT verwenden -Klausel, um eindeutige Werte zurückzugeben. Mit anderen Worten, wenn es doppelte Werte gibt, wird nur ein Vorkommen zurückgegeben:

SELECT GROUP_CONCAT(DISTINCT PetName ORDER BY PetName ASC)
FROM Pets; 

Ergebnis:

bellen, holen, flauschig, miauen, kratzen, twittern, wedeln

In diesem Fall Fluffy taucht nur einmal auf. Wenn wir es ohne DISTINCT ausführen Klausel, Fluffy erscheint zweimal.

Trennzeichen ändern

Standardmäßig verwendet die Liste das Komma als Trennzeichen. Aber wir können das ändern, wenn wir wollen:

SELECT GROUP_CONCAT(PetName SEPARATOR '-')
FROM Pets; 

Ergebnis:

Fluffy-Fetch-Scratch-Wag-Tweet-Fluffy-Bark-Miau

Wir können sogar einen leeren String verwenden, um alle Trennzeichen zu entfernen (damit die Werte verkettet werden):

SELECT GROUP_CONCAT(PetName SEPARATOR '')
FROM Pets; 

Und wir erhalten das folgende Ergebnis:

FluffyFetchScratchWagTweetFluffyBarkMeow

Gruppierte Abfrageergebnisse

Wir können GROUP_CONCAT() einschließen in einer Abfrage mit einem GROUP BY -Klausel, um ein Ergebnis wie dieses zu erzielen:

SELECT 
    PetTypeId,
    GROUP_CONCAT(PetName ORDER BY PetName ASC)
FROM Pets
GROUP BY PetTypeId
ORDER BY PetTypeId; 

Ergebnis:

+---+---------------------------------- ----------+| PetTypeId | GROUP_CONCAT(PetName ORDER BY PetName ASC) |+-----------+------------------------------------ ----------------+| 1 | Twittern || 2 | Flauschig, miau, kratzen || 3 | Bellen,Fangen,Flauschig,Wedeln |+-----------+----------------------------- ---------------+

In meiner Datenbank befinden sich die eigentlichen Haustiertypnamen in einer anderen Tabelle namens PetTypes . Wir könnten daher einen INNER JOIN ausführen auf den PetTypes Tabelle, um die tatsächlichen Tiertypnamen zu erhalten:

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; 

Ergebnis:

+---------+------------------------------------ -------------+| Haustiertyp | GROUP_CONCAT(p.PetName ORDER BY p.PetName ASC) |+---------+--------------------- ----------------------+| Vogel | Twittern || Katze | Flauschig, miau, kratzen || Hund | Bellen, Holen, Flauschig, Wedeln |+---------+------------------------------- ------------------+

Längenbeschränkungen

GROUP_CONCAT() Die Ausgabe wird auf die maximale Länge gekürzt, die durch group_concat_max_len angegeben wird Systemvariable, die einen Standardwert von 1024 hat . Der Wert kann höher eingestellt werden, obwohl die effektive maximale Länge des Rückgabewerts durch den Wert von max_allowed_packet eingeschränkt wird .

Sie können den aktuellen Wert wie folgt überprüfen:

SHOW VARIABLES LIKE '%group_concat%'; 

Die Syntax zum Ändern dieses Werts lautet wie folgt:

SET [GLOBAL | SESSION] group_concat_max_len = val; 

Wobei val ist eine Ganzzahl ohne Vorzeichen.