2011-07-24 7 views
11

Tengo una relación de muchos a muchos entre personas y departamentos ya que una persona puede estar en muchos departamentos.¿Cómo concatenar datos de un campo, en una lista delimitada por comas, en una relación muchos a muchos en MySQL?

People   Departments 
------   ----------- 
pID pName  deptID deptName 
1 James  1  Engineering 
2 Mary  2  Research 
3 Paul  3  Marketing 
       4  Communications 

People_Departments 
------------------ 
pID deptID 
1  1 
1  2 
2  2 
2  4 
3  1 
3  2 
3  3 

Lo que yo quiero es éste:

pName deptName 
James Engineering, Research 
Mary Research, Communication 
Paul Engineering, Research, Marketing 

Si hago IZQUIERDA llanura uniones en las tablas utilizando el SQL a continuación, voy a tener varias filas relacionada con una persona:

SELECT people.pName, 
     departments.deptName 
FROM people 
LEFT JOIN people_departments ON people.pID=people_departments.pID 
LEFT JOIN departments ON people_departments.deptID=departments.deptID 

He intentado varias combinaciones de GROUP_CONCAT pero sin suerte.

¿Alguna idea para compartir?

Respuesta

11
SELECT people.pName, 
      GROUP_CONCAT(departments.deptName SEPARATOR ', ') deptName 
     FROM people 
LEFT JOIN people_departments 
     ON people.pID = people_departments.pID 
INNER JOIN departments 
     ON people_departments.deptID = departments.deptID 
    GROUP BY people.pID 

Salida:

+-------+----------------------------------+ 
| pName | deptName       | 
+-------+----------------------------------+ 
| James | Engineering, Research   | 
| Mary | Research, Communications   | 
| Paul | Engineering, Research, Marketing | 
+-------+----------------------------------+ 
3 rows in set (0.00 sec) 
+1

En realidad, ninguno de mis combinaciones funcionó porque omití el GROUP BY, la cual es muy importante. Obtengo datos de varias tablas relacionadas de muchos a muchos en mi proyecto real, y logré obtener los datos que quiero con su ayuda. ¡Gracias de nuevo! – shailenTJ

0

Mi solución es:

SELECT people.pName, 
GROUP_CONCAT(tmp.deptName SEPARATOR ', ') deptName 
FROM people 
LEFT JOIN (SELECT people_departments.pID, departments.deptName FROM people_departments LEFT JOIN departments ON people_departments.deptID = departments.deptID) as tmp 
ON tmp.pID = people.pID 
GROUP BY people.pID 

resultado:

+-------+----------------------------------+ 
| pName | deptName       | 
+-------+----------------------------------+ 
| James | Engineering, Research   | 
| Mary | Research, Communications   | 
| Paul | Engineering, Research, Marketing | 
+-------+----------------------------------+ 
Cuestiones relacionadas