2008-12-29 70 views
9

Estoy tratando de escribir una consulta MySQL que recupera un registro de la tabla "proyectos" que tiene una relación uno a muchos con las "etiquetas" de la tabla. Mi aplicación utiliza 4 mesas de hacer esto:¿Es posible concatenar cadenas de varias filas y tablas en una columna de resultados?

Projects - the projects table 
Entities - entity table; references several application resources 
Tags - tags table 
Tag_entity - links tags to entities 

¿Es posible escribir la consulta de tal manera que múltiples valores de la tabla "Variables" se concatenan en una columna de resultados? Prefiero hacer esto sin usar subconsultas.

Tabla aclaración:

         ------------- 
            | Tag_Entity | 
-------------  ----------  | ----------- |  ------- 
| Projects |  | Entities |  | - id  |  | Tags | 
| ----------- |  | -------- |  | - tag_id |  | ----- | 
| - id  | --> | - id  | --> | - entity_id | --> | id | 
| - entity_id |  ----------  -------------  | name | 
-------------           ------- 

resultado deseado:

Projects.id Entities.id Tags.name (concatenated) 
1    5    'foo','bar','etc' 

Respuesta

20

ver GROUP_CONCAT

ejemplo:

mysql> SELECT * FROM blah; 
+----+-----+-----------+ 
| K | grp | name  | 
+----+-----+-----------+ 
| 1 | 1 | foo  | 
| 2 | 1 | bar  | 
| 3 | 2 | hydrogen | 
| 4 | 4 | dasher | 
| 5 | 2 | helium | 
| 6 | 2 | lithium | 
| 7 | 4 | dancer | 
| 8 | 3 | winken | 
| 9 | 4 | prancer | 
| 10 | 2 | beryllium | 
| 11 | 1 | baz  | 
| 12 | 3 | blinken | 
| 13 | 4 | vixen  | 
| 14 | 1 | quux  | 
| 15 | 4 | comet  | 
| 16 | 2 | boron  | 
| 17 | 4 | cupid  | 
| 18 | 4 | donner | 
| 19 | 4 | blitzen | 
| 20 | 3 | nod  | 
| 21 | 4 | rudolph | 
+----+-----+-----------+ 
21 rows in set (0.00 sec) 

mysql> SELECT grp, GROUP_CONCAT(name ORDER BY K) FROM blah GROUP BY grp; 
+-----+----------------------------------------------------------------+ 
| grp | GROUP_CONCAT(name ORDER BY K)         | 
+-----+----------------------------------------------------------------+ 
| 1 | foo,bar,baz,quux            | 
| 2 | hydrogen,helium,lithium,beryllium,boron      | 
| 3 | winken,blinken,nod            | 
| 4 | dasher,dancer,prancer,vixen,comet,cupid,donner,blitzen,rudolph | 
+-----+----------------------------------------------------------------+ 
4 rows in set (0.00 sec) 
+0

¡Gran respuesta, esto funciona como un encanto! Gracias. –

3

No sé si funciona en MySQL, pero en SQL Server, puede utilizar un truco para esto:

DECLARE @csv varchar(max) 
SET @csv = '' 
SELECT @csv = @csv + ',' + foo.SomeColumn 
FROM [FOO] foo 
WHERE foo.SomeId = @SomeId 

Luego, en la selección principal

SELECT ..., @csv AS [Tags] 
FROM ... 

El resultado de la línea SELECT @csv = @csv + ',' + foo.SomeColumn es que @csv se convierte en la lista separada por comas de todos los registros coincidentes de la tabla fuente (después del predicado).

¿Vale la pena intentarlo en MySQL?

+0

Gracias por la rápida respuesta; esto parece un truco útil, pero preferiría usar una sola consulta (si es posible). –

+0

péguelo en una función y llámalo en línea. – StingyJack

Cuestiones relacionadas