Usando MySQL
, posso fare qualcosa come:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
Il mio risultato:
shopping
fishing
coding
ma invece voglio solo 1 riga, 1 colonna:
Uscita prevista:
shopping, fishing, coding
Il motivo è che sto selezionando più valori da più tabelle, e dopo tutte le join ho molte più righe di quelle che vorrei.
Ho cercato una funzione su MySQL Doc e non sembra che le funzioni CONCAT
o CONCAT_WS
accettino set di risultati, quindi qualcuno qui sa come farlo?
Puoi usare GROUP_CONCAT
:
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Come ha detto Ludwig nel suo commento, puoi aggiungere l'operatore DISTINCT
per evitare i duplicati:
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Come affermato da Jan nel suo commento, puoi anche ordinare i valori prima di implodere usando ORDER BY
:
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Come ha detto Dag nel suo commento, c'è un limite di 1024 byte sul risultato. Per risolverlo, esegui questa query prima della tua query:
SET group_concat_max_len = 2048;
Naturalmente, puoi cambiare 2048
in base alle tue esigenze. Per calcolare e assegnare il valore:
SET group_concat_max_len = CAST(
(SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
FROM peoples_hobbies
GROUP BY person_id)
AS UNSIGNED
);
Dai un'occhiata a GROUP_CONCAT
se la tua versione di MySQL (4.1) lo supporta. Vedi la documentazione per maggiori dettagli.
Sembrerebbe qualcosa del genere:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';