¿Puedo concatenar varias filas de MySQL en un solo campo?

Usando MySQL, puedo hacer algo como:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

Mi salida:

shopping
fishing
coding

pero en su lugar sólo quiero 1 fila, 1 col:

Salida esperada:

shopping, fishing, coding

El motivo es que estoy seleccionando varios valores de varias tablas, y después de todas las uniones tengo muchas más filas de las que me gustaría.

He buscado una función en <a href="http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws"Doc<MySQL y no parece que las funciones CONCAT o CONCAT_WS acepten conjuntos de resultados, así que ¿alguien aquí sabe cómo hacer esto?

Solución

Puede utilizar [GROUP_CONCAT][group-concat]:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

Como dijo Ludwig en su comentario, puedes añadir el operador DISTINCT para evitar duplicados:

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies 
GROUP BY person_id;

Como Jan dijo en su comentario, también puedes ordenar los valores antes de implosionar usando ORDER BY:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

Como Dag dijo en su comentario, hay un límite de 1024 bytes en el resultado. Para solucionar esto, ejecuta esta consulta antes de tu consulta:

SET group_concat_max_len = 2048;

Por supuesto, puedes cambiar 2048 según tus necesidades. Para calcular y asignar el valor:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies 
    GROUP BY person_id)
    AS UNSIGNED
);
Comentarios (8)

Eche un vistazo a GROUP_CONCAT si su versión de MySQL (4.1) lo soporta. Vea la documentación para más detalles.

Se vería algo así:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';
Comentarios (1)

Existe una función agregada de GRUPO, GROUP_CONCAT.

Comentarios (0)