Met behulp van MySQL
, kan ik zoiets doen als:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Mijn uitvoer:
shopping
fishing
coding
maar in plaats daarvan wil ik slechts 1 rij, 1 kolom:
Uitgang verwacht:
shopping, fishing, coding
De reden is dat ik'meerdere waarden uit meerdere tabellen selecteer, en na alle joins heb ik'veel meer rijen dan ik'zou willen.
Ik'heb gezocht naar een functie op MySQL Doc en het lijkt er niet op dat de CONCAT
of CONCAT_WS
functies result sets accepteren, dus weet iemand hier hoe je dit moet doen?
U kunt [GROUP_CONCAT
][group-concat] gebruiken:
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Zoals Ludwig in zijn commentaar, aangeeft, kun je de DISTINCT
operator toevoegen om duplicaten te vermijden:
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Zoals Jan in zijn commentaar, aangaf, kun je de waarden ook sorteren met ORDER BY
alvorens ze te imploderen:
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Zoals Dag in zijn commentaar, aangaf, is er een limiet van 1024 bytes op het resultaat. Om dit op te lossen, voer je deze query uit voor je query:
SET group_concat_max_len = 2048;
Natuurlijk kun je 2048
veranderen naar gelang je behoeften. Om de waarde te berekenen en toe te wijzen:
SET group_concat_max_len = CAST(
(SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
FROM peoples_hobbies
GROUP BY person_id)
AS UNSIGNED
);
Kijk eens naar GROUP_CONCAT
als uw MySQL versie (4.1) dit ondersteunt. Zie de documentatie voor meer details.
Het zou er ongeveer zo uitzien:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';