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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top