MariaDB hat einen GROUP_CONCAT()
Funktion, die es uns ermöglicht, Spalten aus einer Abfrage als begrenzte Liste zurückzugeben.
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]
[LIMIT {[offset,] row_count | row_count OFFSET offset}])
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,001 Sek.)
Wir können GROUP_CONCAT()
verwenden alle diese Zeilen als Liste mit Trennzeichen zurückzugeben.
Dazu müssen wir lediglich 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 DESC)
FROM Pets;
Ergebnis:
Wag, twittere, kratze, miau, flauschig, flauschig, holen, bellen
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.
Begrenzung der Ausgabe
Wir können das LIMIT
verwenden -Klausel, um zu begrenzen, wie viele Elemente in der Liste enthalten sind:
SELECT GROUP_CONCAT(PetName LIMIT 3)
FROM Pets;
Ergebnis:
Flauschig, Holen, Kratzen
Jede Bestellung wird vor dem LIMIT
angewendet Klausel:
SELECT GROUP_CONCAT(PetName ORDER BY PetName DESC LIMIT 3)
FROM Pets;
Ergebnis:
Wag, twittere, kratze
Beachten Sie, dass das LIMIT
-Klausel wird nur von MariaDB 10.3.3 unterstützt.
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
Die maximal zurückgegebene Länge in Bytes wird durch group_concat_max_len
bestimmt server-Systemvariable, die standardmäßig auf 1M (in MariaDB 10.2.4 und höher) oder 1K (in MariaDB 10.2.3 und niedriger) eingestellt ist. Wenn group_concat_max_len
ist 512
oder niedriger, ist der Rückgabetyp VARBINARY
oder VARCHAR
; andernfalls ist der Rückgabetyp BLOB
oder TEXT
. Die Wahl zwischen binären oder nicht-binären Typen hängt von der Eingabe ab.
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.