MySQL-Ergebnisse als durch Kommas getrennte Liste

129

Ich muss eine Abfrage ausführen wie:

SELECT p.id, p.name, 
       (SELECT name 
          FROM sites s 
         WHERE s.id = p.site_id) AS site_list
  FROM publications p

Ich möchte jedoch, dass die Unterauswahl anstelle einer Datenspalte eine durch Kommas getrennte Liste zurückgibt. Ist das überhaupt möglich und wenn ja, wie?

Glen Solsberry
quelle

Antworten:

250

Sie können GROUP_CONCAT verwenden , um dies auszuführen, z. B. so etwas

SELECT p.id, p.name, GROUP_CONCAT(s.name) AS site_list
FROM sites s
INNER JOIN publications p ON(s.id = p.site_id)
GROUP BY p.id, p.name;
Paul Dixon
quelle
10
Beachten Sie außerdem schnell, dass Sie, wenn Sie PHPMyAdmin verwenden und eine durch Kommas getrennte Liste auf der Seite ausgeben möchten, diese Option verwenden, da GROUP_CONCAT(CAST(s.name AS CHAR))sonst nur etwas völlig Unnützes zurückgegeben wird [BLOB - 20 Bytes].
devios1
3
Die Absicht ist in Ordnung und MySQL wird dies zulassen, aber seien Sie (im Allgemeinen) vorsichtig mit Ihrer Verwendung von GROUP BY. Die Elemente in der Auswahlliste müssen im Kontext der GROUP BY-Klausel gültige Aggregate sein. In diesem Fall ist p.name nicht unbedingt gültig. Jede Datenbank, die dem SQL-Standard entspricht, behandelt dies als Fehler. Verwenden Sie in diesem Fall entweder MAX (p.name) in der Auswahlliste oder fügen Sie p.name zur GROUP BY-Klausel hinzu. Da Paul wahrscheinlich bedeutet, dass p.id einen Primär- oder eindeutigen Schlüssel darstellt, hat das Hinzufügen von p.name zur GROUP BY-Klausel keine Auswirkungen auf das Endergebnis.
Jon Armstrong - Xgc
Beachten Sie, dass Sie möglicherweise die maximale Länge für die Sitzung pro stackoverflow.com/questions/2567000/…
festlegen
Vielen Dank! Sie haben mir sehr geholfen!
André Agostinho
11

Anstatt zu verwenden group concat(), können Sie nur verwendenconcat()

Select concat(Col1, ',', Col2) as Foo_Bar from Table1;

Bearbeiten funktioniert nur in mySQL; Oracle Concat akzeptiert nur zwei Argumente. In Orakel können Sie so etwas wie select col1 || ',' || col2 || ',' || col3 als foobar aus table1 verwenden; In SQL Server würden Sie + anstelle von Pipes verwenden.

Robert Quinn
quelle
2
Dies sollte im Fall GROUP BY nicht funktionieren, während GROUP_CONCAT () den Inhalt einer einzelnen Spalte verkettet
Aram Paronikyan
5

Jetzt bin nur ich auf diese Situation gestoßen und habe einige interessantere Funktionen gefunden GROUP_CONCAT. Ich hoffe, dass Sie sich durch diese Details interessant fühlen.

einfache GROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Ergebnis:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

GROUP_CONCAT mit DISTINCT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Ergebnis:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

GROUP_CONCAT mit DISTINCT und ORDER BY

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

Ergebnis:

+--------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) |
+--------------------------------------------------------+
| Take dog for walk,Relax,Paint roof,Feed cats,Do garden |
+--------------------------------------------------------+

GROUP_CONCAT mit DISTINCT und SEPARATOR

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

Ergebnis:

+----------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ')                |
+----------------------------------------------------------------+
| Do garden + Feed cats + Paint roof + Relax + Take dog for walk |
+----------------------------------------------------------------+

GROUP_CONCAT und Kombinieren von Spalten

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

Ergebnis:

+------------------------------------------------------------------------------------+
| GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ')                                 |
+------------------------------------------------------------------------------------+
| 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats |
+------------------------------------------------------------------------------------+

GROUP_CONCAT und gruppierte Ergebnisse Nehmen Sie an, dass die folgenden Ergebnisse vor der Verwendung vorliegenGROUP_CONCAT

+------------------------+--------------------------+
| ArtistName             | AlbumName                |
+------------------------+--------------------------+
| Iron Maiden            | Powerslave               |
| AC/DC                  | Powerage                 |
| Jim Reeves             | Singing Down the Lane    |
| Devin Townsend         | Ziltoid the Omniscient   |
| Devin Townsend         | Casualties of Cool       |
| Devin Townsend         | Epicloud                 |
| Iron Maiden            | Somewhere in Time        |
| Iron Maiden            | Piece of Mind            |
| Iron Maiden            | Killers                  |
| Iron Maiden            | No Prayer for the Dying  |
| The Script             | No Sound Without Silence |
| Buddy Rich             | Big Swing Face           |
| Michael Learns to Rock | Blue Night               |
| Michael Learns to Rock | Eternity                 |
| Michael Learns to Rock | Scandinavia              |
| Tom Jones              | Long Lost Suitcase       |
| Tom Jones              | Praise and Blame         |
| Tom Jones              | Along Came Jones         |
| Allan Holdsworth       | All Night Wrong          |
| Allan Holdsworth       | The Sixteen Men of Tain  |
+------------------------+--------------------------+
USE Music;
SELECT ar.ArtistName,
    GROUP_CONCAT(al.AlbumName)
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

Ergebnis:

+------------------------+----------------------------------------------------------------------------+
| ArtistName             | GROUP_CONCAT(al.AlbumName)                                                 |
+------------------------+----------------------------------------------------------------------------+
| AC/DC                  | Powerage                                                                   |
| Allan Holdsworth       | All Night Wrong,The Sixteen Men of Tain                                    |
| Buddy Rich             | Big Swing Face                                                             |
| Devin Townsend         | Epicloud,Ziltoid the Omniscient,Casualties of Cool                         |
| Iron Maiden            | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying |
| Jim Reeves             | Singing Down the Lane                                                      |
| Michael Learns to Rock | Eternity,Scandinavia,Blue Night                                            |
| The Script             | No Sound Without Silence                                                   |
| Tom Jones              | Long Lost Suitcase,Praise and Blame,Along Came Jones                       |
+------------------------+----------------------------------------------------------------------------+
Ganesa Vijayakumar
quelle
3

In meinem Fall muss ich die gesamte Kontonummer einer Person verketten, deren Handynummer eindeutig ist. Also habe ich die folgende Abfrage verwendet, um das zu erreichen.

SELECT GROUP_CONCAT(AccountsNo) as Accounts FROM `tblaccounts` GROUP BY MobileNumber

Das Abfrageergebnis ist unten:

Accounts
93348001,97530801,93348001,97530801
89663501
62630701
6227895144840002
60070021
60070020
60070019
60070018
60070017
60070016
60070015
Vignesh Chinnaiyan
quelle