Pomocou MySQL
môžem urobiť niečo podobné:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Môj výstup:
shopping
fishing
coding
ale namiesto toho chcem len 1 riadok, 1 stĺpec:
Očakávaný výstup:
shopping, fishing, coding
Dôvodom je, že vyberám viac hodnôt z viacerých tabuliek a po všetkých spojeniach mám oveľa viac riadkov, ako by som chcel.
Hľadal'som funkciu na MySQL Doc a nevyzerá'to, že by funkcie CONCAT
alebo CONCAT_WS
akceptovali množiny výsledkov, takže vie tu niekto, ako to urobiť?
Môžete použiť GROUP_CONCAT
:
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Ako uviedol Ludwig vo svojom komentári, môžete pridať operátor DISTINCT
, aby ste sa vyhli duplicitám:
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Ako uviedol Jan vo svojom komentári,, hodnoty môžete pred implodovaním zoradiť aj pomocou ORDER BY
:
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Ako uviedol Dag vo svojom komentári, na výsledok je limit 1024 bajtov. Ak to chcete vyriešiť, spustite tento dotaz pred vaším dotazom:
SET group_concat_max_len = 2048;
Samozrejme, môžete zmeniť 2048
podľa svojich potrieb. Na výpočet a priradenie hodnoty:
SET group_concat_max_len = CAST(
(SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
FROM peoples_hobbies
GROUP BY person_id)
AS UNSIGNED
);
Pozrite sa na GROUP_CONCAT
, ak to vaša verzia MySQL (4.1) podporuje. Viac informácií nájdete v dokumentácii.
Vyzeralo by to asi takto:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';