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?
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
);
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';