MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

MariaDB GROUP_CONCAT()

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:

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

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.