11 Stimme

MySQL: CONCAT über mehrere Zeilen

Frage von Gast | 23.09.2014 um 20:19

Ich würde gerne das Ergebnis aus mehreren Feldern zusammengefasst aus einer Datenbank auslesen.

Wenn diese Felder innerhalb von einer Zeile in der Tabelle vorliegen, ist dies kein Problem und man kann CONCAT benutzen. Also zum Beispiel folgende Abfrage um Vorname und Nachname einer Person zusammen auszulesen:

SELECT CONCAT(firstname, ' ', lastname) AS fullname
FROM users
WHERE id = 1

Obwohl "firstname" und "lastname" zwei unterschiedliche Felder in der Datenbank sind, werden sie als ein gemeinsames Feld "fullname" im Ergebnis angezeigt.

Nun möchte ich aber über mehrere Zeilen hinweg ein CONCAT durchführen, also das Ergebnis aus mehreren Feldern untereinander zusammenfassen.

Zum Beispiel könnte man jedem Nutzer mehrere Eigenschaften zuordnen, diese stehen in der Tabelle "props", für jeden Nutzer und jede Eigenschaft eine gesonderte Zeile. Um die Eigenschaften auszulesen, würde man folgende Abfrage machen:

SELECT prop 
FROM props
WHERE user_id = 1

Das Ergebnis einer solchen Abfrage könnte zum Beispiel so aussehen (in drei Ergebnis-Zeilen):

A
B
C

Ich hätte aber lieber als Ergebnis folgende Anordnung in nur einem Ergebnis-Feld:

A, B, C

Gibt es da irgendeine Möglichkeit in MySQL ein solches Ergebnis zu bekommen?

AntwortenPositivNegativ
4Beste Antwort4 Stimmen

Schau dir einmal GROUP_CONCAT an. Damit sollte genau das möglich sein, was du suchst.

So bekommst du ein Ergebnis in der Form "A,B,C":

SELECT GROUP_CONCAT(col) 
FROM props 
WHERE user_id = 1

Möchtest du den Separator selber bestimmen, kannst du einen String hinter SEPARATOR angeben:

SELECT GROUP_CONCAT(col SEPARATOR ', ') 
FROM props 
WHERE user_id = 1

Falls du das Ergebnis sortieren möchtest kannst du ORDER BY <Spalte> ASC oder DESC benutzen:

SELECT GROUP_CONCAT(col ORDER BY col ASC SEPARATOR ',') 
FROM props 
WHERE user_id = 1

Doppelte Werte eliminierst du mit DISTINCT:

SELECT GROUP_CONCAT(DISTINCT col SEPARATOR ', ') 
FROM props 
WHERE user_id = 1

Falls du mehrere Nutzer gleichzeitig auslesen möchtest, kannst du mit GROUP BY arbeiten:

SELECT user_id, GROUP_CONCAT(col SEPARATOR ', ') 
FROM props 
GROUP_BY user_id

Wichtig, wenn lange Ergebnisse erwartbar sind: MySQL kennt die Variable group_concat_max_len, die meistens auf 1024 Byte steht und das Ergebnis eines GROUP_CONCAT-Feldes begrenzt. Kommst du über diesen Wert hinaus, würde das Ergebnis abgeschnitten. In den MySQL-Einstellungen und über "SET group_concat_max_len = NEUERWERT" kannst du den Wert deinen Bedürfnissen entsprechend anpassen.
24.09.2014 um 17:10

AntwortenPositiv Negativ
Antworten

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.