varios varias unir una subconsulta sola registros group_concat filas español ejemplos concatenar columna campos cadena mysql sql concat group-concat

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



sql server concatenar campos (9)

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 col:

Rendimiento esperado:

shopping, fishing, coding

La razón es que estoy seleccionando varios valores de varias tablas y, después de todas las combinaciones, tengo muchas más filas de las que me gustaría.

He buscado una función en MySQL Doc y no parece que las funciones CONCAT o CONCAT_WS acepten conjuntos de resultados, ¿por lo tanto, alguien aquí sabe cómo hacer esto?


Sintaxis alternativa para concatenar múltiples filas individuales

ADVERTENCIA: Este post te dará hambre.

Dado:

Me encontré con ganas de seleccionar varias filas individuales, en lugar de un grupo, 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 | +------------+--------------------+-------+

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

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

Encontrar:

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

Solución:

Use GROUP_CONCAT con 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 Bonus:

Si también quieres el precio total, agrega 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 ...


Eche un vistazo a GROUP_CONCAT si su versión de MySQL (4.1) lo admite. Consulte GROUP_CONCAT 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'';


En mi caso tuve una fila de identificadores, y fue necesario convertirlo a char, de lo contrario, el resultado se codificó en formato binario:

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



Prueba esto:

DECLARE @Hobbies NVARCHAR(200) = '' '' SELECT @Hobbies = @Hobbies + hobbies + '','' FROM peoples_hobbies WHERE person_id = 5;


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

Ver detalles en la documentación de GROUP_CONCAT .


Puedes usar GROUP_CONCAT :

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

Como Ludwig declaró 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 utilizando 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 acuerdo a 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 );


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

Implosionado

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.


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

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

entonces puedes conseguir

test1,test11