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?
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
);
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';