¿Puedo concatenar múltiples filas MySQL en un campo?
-
07-07-2019 - |
Pregunta
Usando 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:
Salida esperada:
shopping, fishing, coding
El motivo es que selecciono varios valores de varias tablas y, después de todas las uniones, tengo muchas más filas de las que quisiera.
He buscado una función en MySQL Doc y no parece que las funciones CONCAT
o CONCAT_WS
acepten conjuntos de resultados, entonces, ¿alguien aquí sabe cómo hacer esto?
Solución
Puede usar GROUP_CONCAT
:
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Como dijo Ludwig en su comentario, puede agregar el operador DISTINCT
para evitar duplicados:
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Como Jan declaró en su comentario, también puede ordenar los valores antes de implosionarlos 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, puede 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
);
Otros consejos
Eche un vistazo a GROUP_CONCAT
si su versión de MySQL (4.1) lo admite. Consulte la documentación para obtener más información detalles.
Se vería algo así como:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';
Sintaxis alternativa para concatenar múltiples filas individuales
ADVERTENCIA: Esta publicación te dará hambre.
Dado:
Me encontré con ganas de seleccionar múltiples filas individuales & # 8212; en lugar de un grupo & # 8212; y concatenar en un campo determinado.
Digamos 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 sofisticado 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 ...
Buscar:
Una forma de resumir el pedido de su usuario en una línea, con mysql puro.
Solución:
Utilice GROUP_CONCAT
con el la cláusula IN
:
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 adicional:
Si también desea 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 |
+------------------------------------------------+-------+
PD: Disculpas si no tienes un In-N-Out cerca ... .
Puede cambiar la longitud máxima del valor GROUP_CONCAT
configurando el parámetro group_concat_max_len
.
Ver detalles en el documentación MySQL .
Hay una función GRUPO Agregado, GROUP_CONCAT .
En mi caso, tenía una fila de ID, y era necesario convertirlo en char, de lo contrario, el resultado se codificó en formato binario:
SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
Utilice la variable de sesión MySQL (5.6.13) y el operador de asignación como se indica a continuación
SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;
entonces puedes obtener
test1,test11
Tenía una consulta más complicada y descubrí que tenía que usar GROUP_CONCAT
en una consulta externa para que funcionara:
Consulta original:
SELECT DISTINCT userID
FROM event GROUP BY userID
HAVING count(distinct(cohort))=2);
Imploded:
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.
Prueba esto:
DECLARE @Hobbies NVARCHAR(200) = ' '
SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
Para alguien que mira aquí cómo usar GROUP_CONCAT
con subconsulta - publicar 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
Entonces GROUP_CONCAT
debe usarse dentro de la subconsulta, no envolverla.
tenemos dos formas de concatenar columnas en MySql
select concat(hobbies) as `Hobbies` from people_hobbies where 1
O
select group_concat(hobbies) as `Hobbies` from people_hobbies where 1