2009-03-19 7 views
103

Ich brauche eine Abfrage wie ausgeführt:MySQL Ergebnisse als durch Kommata getrennte Liste

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

Aber ich möchte die Unterauswahl eine durch Kommata getrennte Liste zurückzukehren, anstatt eine Spalte von Daten. Ist das überhaupt möglich, und wenn ja, wie?

Antwort

206

Sie können GROUP_CONCAT verwenden, um z. so etwas wie

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; 
+1

toll es für mich Dank gearbeitet !!!!! – Devjosh

+9

Wenn Sie PHPMyAdmin verwenden und eine kommagetrennte Liste auf der Seite ausgeben möchten, verwenden Sie 'GROUP_CONCAT (CAST (s.name AS CHAR))' oder sonst wird etwas zurückgegeben, das völlig unbrauchbar ist wie ' [BLOB - 20 Bytes] '. – devios1

+2

Die Absicht ist in Ordnung und MySQL wird dies erlauben, aber seien Sie vorsichtig (allgemein) 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 streng gültig. Jede Datenbank, die dem SQL-Standard entspricht, behandelt dies als Fehler. In diesem Fall verwenden Sie entweder MAX (p.name) in der Auswahlliste oder fügen p.name zur GROUP BY-Klausel hinzu. Da Paul wahrscheinlich p.id bedeutet, um einen primären oder eindeutigen Schlüssel darzustellen, hat das Hinzufügen von p.name zur GROUP BY-Klausel keine Auswirkungen auf das Endergebnis. –

7

Statt group concat() verwenden Sie können einfach verwenden concat()

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

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

+1

Genau das, was ich brauchte, danke! –

+0

Dies sollte nicht im Fall GROUP BY funktionieren, während GROUP_CONCAT() den Inhalt einer einzelnen Spalte verketten wird –

0

In meinem Fall muss ich alle Kontonummern 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 

Abfrageergebnis ist unter:

Accounts 
93348001,97530801,93348001,97530801 
89663501 
62630701 
6227895144840002 
60070021 
60070020 
60070019 
60070018 
60070017 
60070016 
60070015 
Verwandte Themen