Posso concatenare più righe di MySQL in un campo?

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?

Soluzione

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
);
Commentari (8)

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';
Commentari (1)

C'è una funzione GROUP Aggregate, GROUP_CONCAT.

Commentari (0)