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

So geben Sie Abfrageergebnisse als kommagetrennte Liste in MySQL zurück

In MySQL können Sie Ihre Abfrageergebnisse als kommagetrennte Liste zurückgeben, indem Sie GROUP_CONCAT() verwenden Funktion.

Die GROUP_CONCAT() Die Funktion wurde speziell für den Zweck entwickelt, die Ergebnismenge einer Abfrage zu einer Liste zu verketten, die entweder durch ein Komma oder ein Trennzeichen Ihrer Wahl getrennt ist.

Dieser Artikel zeigt anhand von Beispielen, wie das alles funktioniert.

Die Daten

Lassen Sie uns zunächst die folgenden Daten in unseren ersten Beispielen verwenden:

USE Solutions;SELECT TaskNameFROM Tasks;

Ergebnis:

+-------------------+| Aufgabenname |+-------------------+| Gärtnern || Katzen füttern || Dach streichen || Geh mit dem Hund spazieren || Entspann dich || Katzen füttern |+-------------------------------+

Einfaches Beispiel

Hier ist ein einfaches Beispiel, um GROUP_CONCAT() zu demonstrieren Funktion:

SELECT GROUP_CONCAT(TaskName) FROM Tasks;

Ergebnis:

+---------------------------------------------- --------------------+| GROUP_CONCAT(TaskName) |+----------------------------------------------------- ----------------------+| Gärtnern,Katzen füttern,Dach streichen,Hund ausführen,Entspannen,Katzen füttern |+------------------------------ ------------------------------------+

Wie Sie sehen können, wurde jede Zeile aus der Ergebnismenge zu einer einzigen Zeile verkettet. Standardmäßig wird die Liste durch ein Komma getrennt.

Beachten Sie, dass es Einschränkungen hinsichtlich der Länge dieser Liste gibt. Mehr dazu später im Artikel.

Beispiel – DISTINCT

Sie können DISTINCT verwenden um Duplikate zu entfernen (so dass doppelte Datensätze zu einem Datensatz werden).

Beispiel:

SELECT GROUP_CONCAT(DISTINCT TaskName) FROM Tasks;

Ergebnis:

+---------------------------------------------- ----------+| GROUP_CONCAT(DISTINCT Aufgabenname) |+-------------------------------------------------------- -------------+| Gärtnern, Katzen füttern, Dach streichen, Entspannen, Hund Gassi gehen |+--------------------------------- -----------------------+

In diesem Fall wird „Katzen füttern“ also nur einmal aufgeführt, während es im vorherigen Beispiel zweimal aufgeführt war.

Beispiel – ORDER BY

Sie können ORDER BY verwenden um die Ergebnisse nach einer bestimmten Spalte zu ordnen.

Beispiel:

SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) FROM Tasks;

Ergebnis:

+---------------------------------------------- ----------+| GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) |+--------------------------------------- ------------------+| Hund Gassi führen,Entspannen,Dach streichen,Katzen füttern,Garten machen |+---------------------------------------------- -----------------------+

In diesem Fall verwende ich also DESC um anzugeben, dass es in absteigender Reihenfolge sein soll. Der alternative (und Standard-)Wert ist ASC zum Aufsteigen.

Beispiel – Geben Sie ein Trennzeichen an

Standardmäßig ist die Liste eine durch Kommas getrennte Liste. Sie können jedoch bei Bedarf ein Trennzeichen Ihrer Wahl angeben.

Verwenden Sie dazu SEPARATOR gefolgt von dem String-Literalwert, der zwischen Gruppenwerten eingefügt werden soll.

Beispiel:

SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') FROM Tasks;

Ergebnis:

+---------------------------------------------- ------------------+| GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') |+--------------------------------------- -------------------------+| Gärtnern + Katzen füttern + Dach streichen + Entspannen + Hund Gassi gehen |+---------------------------------------------- -------------------------------+

Beispiel – Kombinieren von Spalten

Sie können Spalten auch verketten und ihr eigenes Trennzeichen bereitstellen, indem Sie einen Zeichenfolgenliteralwert angeben.

Beispiel:

SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') FROM Tasks;

Ergebnis:

+---------------------------------------------- --------------------------------------+| GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') |+------------------------------ -------------------------------------------------+ | 1) Gärtnern 2) Katzen füttern 3) Dach streichen 4) Hund Gassi gehen 5) Entspannen 6) Katzen füttern |+---------------------- -------------------------------------------------- -----------+

In diesem Beispiel geben wir sowohl die TaskId zurück Spalte und den TaskName Spalte, getrennt durch eine schließende Klammer und ein Leerzeichen. Wir verwenden auch den SEPARATOR Argument, um anzugeben, dass das zwischen jeder (verketteten) Zeile zu verwendende Trennzeichen ein Leerzeichen sein soll (anstelle des standardmäßigen Kommas).

Gruppierte Ergebnisse

Die GROUP_CONCAT() Funktion kann nützlich sein, wenn Sie eine Ergebnisliste, gruppiert nach einer anderen Spalte, bereitstellen möchten.

Beispielsweise möchten Sie vielleicht eine Liste mit Künstlern, wobei jedem Künstler eine Liste mit Alben folgt, die er veröffentlicht hat.

Um dies zu demonstrieren, sagen wir, wir haben eine Datenbank mit zwei Tabellen; Artists und Albums . Zwischen diesen Tabellen besteht eine Eins-zu-Viele-Beziehung. Für jeden Künstler könnte es viele Alben geben.

Eine normale Abfrage, die beide Tabellen verbindet, könnte also etwa so aussehen:

USE Music;SELECT ar.ArtistName, al.AlbumNameFROM Artists arINNER JOIN Alben alON ar.ArtistId =al.ArtistId;

Ergebnis:

+------------------------+--------------------- -----+| Künstlername | Albumname |+------------------------+--------------------- ----+| Eiserne Jungfrau | Machtsklave || Wechselstrom/Gleichstrom | Machtzeit || Jim Reeve | Auf der Straße singen || Devin Townsend | Ziltoid der Allwissende || Devin Townsend | Opfer von Cool || Devin Townsend | Epiwolke || Eiserne Jungfrau | Irgendwo in der Zeit || Eiserne Jungfrau | Seelenfrieden || Eiserne Jungfrau | Mörder || Eiserne Jungfrau | Kein Gebet für die Sterbenden || Das Skript | Kein Ton ohne Stille || Kumpel Reich | Großes Schwinggesicht || Michael lernt zu rocken | Blaue Nacht || Michael lernt zu rocken | Ewigkeit || Michael lernt zu rocken | Skandinavien || Tom Jones | Lange verlorener Koffer || Tom Jones | Lob und Tadel || Tom Jones | Da kam Jones || Allan Holdsworth | Die ganze Nacht falsch || Allan Holdsworth | Die sechzehn Männer von Tain |+------------------------+------------------ --------+

Wie Sie sehen können, wird bei Verwendung dieses Formats ein Künstler, der mehr als ein Album hat, mehrmals aufgelistet – einmal für jedes Album.

Wir könnten diese Abfrage so ändern, dass jeder Künstler nur einmal aufgeführt wird. Wenn ein Künstler mehr als ein Album hat, werden alle Alben in einem einzelnen Feld innerhalb einer durch Kommas getrennten Liste angezeigt. Wir können dies dank GROUP_CONCAT() tun Funktion.

Beispiel:

USE Music;SELECT ar.ArtistName, GROUP_CONCAT(al.AlbumName)FROM Artists arINNER JOIN Alben alON ar.ArtistId =al.ArtistIdGROUP BY ArtistName;

Ergebnis:

+------------------------+--------------------- -------------------------------------------------- -----+| Künstlername | GROUP_CONCAT(al.AlbumName) |+------------------------+---------------- -------------------------------------------------- ---------+| Wechselstrom/Gleichstrom | Machtzeit || Allan Holdsworth | Die ganze Nacht falsch, Die sechzehn Männer von Tain || Kumpel Reich | Großes Schwinggesicht || Devin Townsend | Epicloud,Ziltoid der Allwissende,Opfer der Coolness || Eiserne Jungfrau | Irgendwo in der Zeit,Stück Geist,Machtsklave,Mörder,Kein Gebet für die Sterbenden || Jim Reeve | Auf der Straße singen || Michael lernt zu rocken | Ewigkeit,Skandinavien,Blaue Nacht || Das Skript | Kein Ton ohne Stille || Tom Jones | Lang verlorener Koffer, Lob und Tadel, entlang kam Jones |+------------------------+------------ -------------------------------------------------- --------------+

Achten Sie auf die Länge!

Eine wichtige Sache, die Sie beachten müssen, wenn Sie GROUP_CONCAT() verwenden ist, dass das Ergebnis auf die maximale Länge gekürzt wird, die von group_concat_max_len bereitgestellt wird Systemvariable, die einen Standardwert von 1024 hat .

Der Wert dieser Variable kann mit der folgenden Syntax höher gesetzt werden:

SET [GLOBAL | SESSION] group_concat_max_len =val;

Wobei val ist eine Ganzzahl ohne Vorzeichen.

Beachten Sie jedoch, dass die effektive maximale Länge des Rückgabewerts selbst durch den Wert von max_allowed_packet eingeschränkt wird .