mysql - varios - unir varias filas en una sola sql




¿Puedo concatenar múltiples filas de MySQL en un campo? (6)

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


Prueba esto:

DECLARE @Hobbies NVARCHAR(200) = ' '

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

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.





group-concat