Kann ich mehrere MySQL-Zeilen in ein Feld verketten?

Mit MySQL kann ich etwas tun wie:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

Meine Ausgabe:

shopping
fishing
coding

aber stattdessen möchte ich nur 1 Zeile, 1 Spalte:

Erwartete Ausgabe:

shopping, fishing, coding

Der Grund dafür ist, dass ich mehrere Werte aus mehreren Tabellen auswähle, und nach all den Joins habe ich viel mehr Zeilen als ich möchte.

Ich habe auf MySQL Doc nach einer Funktion gesucht und es sieht nicht so aus, als ob die Funktionen CONCAT oder CONCAT_WS Ergebnismengen akzeptieren, weiß also jemand hier, wie man das macht?

Lösung

Sie können GROUP_CONCAT verwenden:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

Wie Ludwig in seinem Kommentar, erwähnt, können Sie den Operator DISTINCT hinzufügen, um Duplikate zu vermeiden:

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies 
GROUP BY person_id;

Wie Jan in seinem Kommentar erklärte, können Sie die Werte auch vor dem Implodieren mit ORDER BY sortieren:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

Wie Dag in seinem Kommentar erklärte, ist das Ergebnis auf 1024 Byte begrenzt. Um dies zu lösen, führen Sie diese Abfrage vor Ihrer Abfrage aus:

SET group_concat_max_len = 2048;

Natürlich können Sie 2048 nach Ihren Bedürfnissen ändern. Um den Wert zu berechnen und zuzuweisen:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies 
    GROUP BY person_id)
    AS UNSIGNED
);
Kommentare (8)

Werfen Sie einen Blick auf GROUP_CONCAT, wenn Ihre MySQL-Version (4.1) dies unterstützt. Siehe die Dokumentation für weitere Details.

Es würde in etwa so aussehen:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';
Kommentare (1)

Es gibt eine Funktion GROUP Aggregate, GROUP_CONCAT.

Kommentare (0)