Wie verwende ich GROUP BY, um Zeichenfolgen in MySQL zu verketten?

351

Grundsätzlich stellt sich die Frage, wie man daraus kommt:

foo_id foo_name
1 A.
1 B.
2 C.

dazu:

foo_id foo_name
1 AB
2 C.
Paweł Hajdan
quelle
13
DOWNVOTE Es ist wirklich verwirrend, eine Spaltenzeichenfolge zu benennen und ihr einen Namen zu geben, der wie ein Datentyp aussieht. Alle Antworten sind also auch davon betroffen, da die Antworten so aussehen, als würden sie einen Datentyp
angeben,
2
@barlop hat das behoben, indem Fragen und Antworten bearbeitet wurden.
Ustun

Antworten:

164
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

Weitere Details hier .

Über den obigen Link GROUP_CONCAT: Diese Funktion gibt ein Zeichenfolgenergebnis mit den verketteten Nicht-NULL-Werten einer Gruppe zurück. Es gibt NULL zurück, wenn keine Nicht-NULL-Werte vorhanden sind.

Graeme Perrow
quelle
die sich ergebende Spalte hat eine Begrenzung in Zeichen. siehe hier und die docs :)
marlo
18
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

Gibt Ihnen eine durch Kommas getrennte Zeichenfolge

Wayne
quelle
17
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

: - In MySQL können Sie die verketteten Werte von Ausdruckskombinationen abrufen. Verwenden Sie die DISTINCT- Klausel, um doppelte Werte zu entfernen . Verwenden Sie die ORDER BY-Klausel, um Werte im Ergebnis zu sortieren. Um in umgekehrter Reihenfolge zu sortieren , fügen Sie das Schlüsselwort DESC (absteigend) zum Namen der Spalte hinzu, nach der Sie in der ORDER BY-Klausel sortieren. Die Standardeinstellung ist aufsteigende Reihenfolge. Dies kann explizit mit dem Schlüsselwort ASC angegeben werden. Das Standardtrennzeichen zwischen Werten in einer Gruppe ist Komma (","). Um ein Trennzeichen explizit anzugeben, verwenden Sie SEPARATOR, gefolgt von dem Zeichenfolgenliteralwert, der zwischen Gruppenwerten eingefügt werden soll. Geben Sie SEPARATOR '' an, um das Trennzeichen vollständig zu entfernen .

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

ODER

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;
Exundoz
quelle
15

Das Ergebnis wird auf die maximale Länge gekürzt, die von der Systemvariablen group_concat_max_len angegeben wird, die einen Standardwert von 1024 Zeichen hat. Wir machen also zuerst Folgendes:

SET group_concat_max_len=100000000;

und dann zum Beispiel:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id
Waqar Alamgir
quelle
Das Ergebnis wird auf die maximale Länge gekürzt, die von der Systemvariablen group_concat_max_len angegeben wird, die einen Standardwert von 1024 Zeichen hat. docs
marlo
Was ist der Umfang dieser group_concat_max_lenKonfiguration? Aktuelle Verbindung / Sitzung oder wirkt sich dies auf andere Clients aus?
Gefrorene Flamme
@FrozenFlame:> Wenn kein Modifikator vorhanden ist, ändert SET die Sitzungsvariable. Wenn die Variable keinen Sitzungswert hat, tritt ein Fehler auf. Von dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
arminrosu
3
Dies beantwortet nicht die Frage des OP, sondern fügt lediglich hilfreiche Informationen hinzu. Dies sollte ein Kommentar sein, keine Antwort.
Sean the Bean
1
Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte, sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Donald Duck
11

Tolle Antworten. Ich hatte auch ein Problem mit NULLS und konnte es lösen, indem ich eine COALESCE in die GROUP_CONCAT einfügte. Beispiel wie folgt:

SELECT id, GROUP_CONCAT(COALESCE(name,'') SEPARATOR ' ') 
FROM table 
GROUP BY id;

Hoffe das hilft jemand anderem

Mauricio Alo
quelle