¿Puedo concatenar varias filas de MySQL en un campo?

Usar 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 columna:

Rendimiento esperado:

shopping, fishing, coding

La razón 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 Documento de MySQL y no parece el CONCAT or CONCAT_WS las funciones aceptan conjuntos de resultados.

Entonces, ¿alguien aquí sabe cómo hacer esto?

preguntado el 10 de noviembre de 08 a las 00:11

Acabo de escribir una pequeña demostración sobre cómo usar group_concat que podría serle útil: giombetti.com/2013/06/06/mysql-group_concat -

11 Respuestas

Puedes usar el GROUP_CONCAT:

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

Como dijo Ludwig 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 implosionarlo usando ORDER BY:

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

Como dijo Dag 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 que puedes cambiar 2048 según sus 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);

Respondido 30 Oct 20, 05:10

Solo tenga en cuenta la limitación de 1024 bytes en la columna resultante (consulte el parámetro grupo_concat_max_len) - Trozo de cuero

Y agregando el DISTINCT parámetro, no obtendrá ningún doble. ... GROUP_CONCAT(DISTINCT hobbies) - Ludwig

Mi necesidad era obtener TODOS los datos de una columna. No use la cláusula GROUP BY para hacer esto. Ejemplo: SELECT GROUP_CONCAT (correos electrónicos SEPARATOR ',') FROM usuarios; - jonathan bergeron

Si desea ordenar los pasatiempos en la cadena implosionada resultante, use: SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id - Ene

GROUP_CONCAT ¡También existe en SQLite y me alegró el día! ¡Entonces +1! - sergiol

Echa un vistazo a GROUP_CONCAT si su versión de MySQL (4.1) lo admite. Ver la documentación para más información.

Se vería algo así como:

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

Respondido el 01 de Septiembre de 17 a las 09:09

Creo que group by 'all' no es necesario (además no deseado), porque esto se asigna a todas las filas de la cadena all y luego comparar cadenas entre estas filas. Estoy en lo cierto? - Krzysiek

Supongo que puedes usar la expresión "GROUP BY NULL" ??? - user251433

Sintaxis alternativa para concatenar múltiples filas individuales

ADVERTENCIA: Esta publicación te dará hambre.

Dado:

Me encontré queriendo seleccionar varias filas individuales—En lugar de un grupo— y concatenar en un campo determinado.

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 |
+------------+--------------------+-------+

Entonces tienes un ajax de fantasía que enumera a 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 pedido de su usuario en una línea, con mysql puro.

Solución:

Utiliza GROUP_CONCAT con 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 también quiere el precio total, agregue 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 |
+------------------------------------------------+-------+

Respondido el 14 de diciembre de 20 a las 15:12

Aunque esta es una buena respuesta, suena más a publicidad que a una simple respuesta. Sigue siendo una buena respuesta bien formada. - FliiFe

Puede cambiar la longitud máxima del GROUP_CONCAT valor configurando el group_concat_max_len parámetro.

Ver detalles en el Documentación de MySQL.

Respondido el 27 de Septiembre de 13 a las 15:09

Hay una función GRUPO Agregado, GROUP_CONCAT.

Respondido el 28 de junio de 16 a las 00:06

En mi caso, tenía una fila de ID y era necesario convertirla en char, de lo contrario, el resultado se codificó en formato binario:

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

Respondido el 10 de junio de 14 a las 10:06

Utilice la variable de sesión MySQL (5.6.13) y el operador de asignación como el siguiente

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

entonces puedes conseguir

test1,test11

Respondido el 27 de Septiembre de 13 a las 19:09

¿es más rápido que GROUP_CONCAT? - jave.web

Probé esto en PHPMyAdmin con el servidor MySQL v5.6.17 en un descripción columna (varchar (50)) en una test tabla pero devuelve un campo BLOB para cada registro: SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test - Ene

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

Implorado:

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.

Respondido 29 Abr '15, 17:04

Para alguien que busque aquí cómo usar GROUP_CONCAT con subconsulta - publicando este ejemplo

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

So GROUP_CONCAT debe usarse dentro de la subconsulta, no envolviéndola.

Respondido 26 Abr '19, 10:04

Prueba esto:

DECLARE @Hobbies NVARCHAR(200) = ' '

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

TL; DR;

set @sql='';
set @result='';
set @separator=' union \r\n';
SELECT 
@sql:=concat('select ''',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME  ,''' as col_name,',
INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH ,' as def_len ,' ,
'MAX(CHAR_LENGTH(',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME , '))as  max_char_len',
' FROM ',
INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
) as sql_piece, if(@result:=if(@result='',@sql,concat(@result,@separator,@sql)),'','') as dummy
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE 
INFORMATION_SCHEMA.COLUMNS.DATA_TYPE like '%char%'
and INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA='xxx' 
and INFORMATION_SCHEMA.COLUMNS.TABLE_NAME='yyy';
select @result;

Respondido 24 Feb 21, 04:02

Esto es lo que obtuve: 'Tipo de declaración no reconocido. (cerca de "DECLARE" en la posición 0) '- istiaque ahmed

tenemos dos formas de concatenar columnas en MySql

select concat(hobbies) as `Hobbies` from people_hobbies where 1

Or

select group_concat(hobbies) as `Hobbies` from people_hobbies where 1

respondido 13 nov., 18:13

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.