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