¿Puedo concatenar varias filas de MySQL en un campo?
Frecuentes
Visto 720,157 equipos
1288
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?
11 Respuestas
1849
Puedes usar 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
117
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
78
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:
Utilice la herramienta 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
41
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
31
Hay una función GRUPO Agregado, GROUP_CONCAT.
Respondido el 28 de junio de 16 a las 00:06
28
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
18
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
16
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
11
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
9
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
2
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 mysql sql concat group-concat or haz tu propia pregunta.
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 - Marc Giombetti
esto puede ayudarte w3resource.com/mysql/agregate-functions-and-grouping/… - Aasif khan