Pregunta ¿Puedo concatenar múltiples filas de MySQL en un campo?


Utilizando MySQL, Puedo hacer algo como:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

Mi salida:

shopping
fishing
coding

pero en cambio solo quiero 1 fila, 1 col:

Rendimiento esperado:

shopping, fishing, coding

La razón es que estoy seleccionando múltiples 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 MySQL Doc y no se ve como el CONCAT o CONCAT_WS las funciones aceptan conjuntos de resultados, ¿alguien aquí sabe cómo hacer esto?


945
2017-11-10 02:34


origen


Respuestas:


Puedes usar GROUP_CONCAT:

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

Como Ludwig declaró en su comentario, puedes agregar el DISTINCT operador para evitar duplicados:

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

Como dijo Jan en su comentario, también puede 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 declaró en su comentario, hay un límite de 1024 bytes en el resultado. Para resolver esto, ejecute esta consulta antes de su consulta:

SET group_concat_max_len = 2048

Por supuesto, puedes cambiar 2048 de acuerdo a 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
)

1380
2017-11-10 02:48



Mira esto GROUP_CONCAT si su versión de MySQL (4.1) lo admite. Ver la documentación para más detalles.

Se vería algo así como:

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

77
2017-09-23 20:26



Sintaxis alternativa para concatenar filas múltiples e individuales

ADVERTENCIA: esta publicación te hará sentir hambriento.

Dado:

Me encontré queriendo seleccionar múltiples filas individuales-en lugar de un grupo-y concatenar en un determinado campo.

Supongamos que tiene una tabla de identificadores de productos y sus nombres y precios:

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

Luego tienes un ajax de fantasía y audacia que enumera estos cachorros como casillas de verificación.

Su usuario de hipopótamo hambriento selecciona 13, 15, 16. No hay postre para ella hoy ...

Encontrar:

Una forma de resumir el orden de su usuario en una línea, con mysql puro.

Solución:

Utilizar GROUP_CONCAT con el el IN cláusula:

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

Qué salidas:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

Solución de bonificación:

Si quiere el precio total también, mezcle SUM():

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

PD: disculpas si no tienes un Dentro y fuera cerca...


52
2018-04-08 11:32



Puede cambiar la longitud máxima de la GROUP_CONCAT valor al configurar el group_concat_max_len parámetro.

Ver detalles en el Documentación de MySQL.


33
2017-11-10 02:48



Hay una función de Agregación de GRUPO GROUP_CONCAT.


23
2018-06-10 09:24



En mi caso, tenía una fila de Id. Y era necesario convertirlo en char, de lo contrario, el resultado estaba codificado en formato binario:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

18
2017-09-27 18:47



Use la variable de sesión MySQL (5.6.13) y el operador de asignación de la siguiente manera

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

entonces puedes obtener

test1,test11

12
2018-04-29 16:35



Tuve una consulta más complicada y descubrí que tenía que usar GROUP_CONCAT en una consulta externa para que funcione:

Consulta original:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

Invocado:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

Espero que esto pueda ayudar a alguien.


9
2018-02-26 15:25



Prueba esto:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

4