为GROUP_CONCAT构建SQL查询多个一对多对多表

时间:2015-06-12 05:48:28

标签: mysql sql subquery many-to-many group-concat

我有四个表格,personemailorganperson_organ以及:

  • personemail具有一对多关系;
  • personorgan通过person_organ具有多对多关系。

问题,如何编写查询,以便为特定器官中的人设置包含full nameall emailall organ列的集合?

据我所知,使用GROUP_CONCAT组合按人分组的电子邮件:

select person.id as 'ID', 
       organ.short_name as 'Organ', 
       CONCAT ( person.first_name, ' ', person.last_name) as 'Full Name', 
       GROUP_CONCAT(email.email SEPARATOR ', ') as 'Emails'
    from person 
  left join person_organ on person.id = person_organ.person_id 
  join organ on organ.id = person_organ.organ_id
  join email on email.person_id = person.id
  where person_organ.organ_id = 1
  group by person.id;

我可以添加到上述查询中,以便添加另一列,显示此人所属的所有组?

到目前为止我所拥有的:

+----+-------+--------------+----------------------------+
| ID | Organ | Full Name    | Emails                     |
+----+-------+--------------+----------------------------+
|  1 | SC    | John Doe     | john@doe.me, jdoe@mail.org |
|  2 | SC    | Richard Rowe | rowe@mail.us               |
|  3 | SC    | San Zhang    | zhangsan@mail.cn           |
|  4 | SC    | Taro Yamada  | yamada@mail.jp             |
+----+-------+--------------+----------------------------+

我想要的是,除了单数 Organs字段之外,还要将Organ作为上述结果集的附加列:

+----+-------+--------------+----------------------------+------------+
| ID | Organ | Full Name    | Emails                     | Organs     |
+----+-------+--------------+----------------------------+------------+
|  1 | SC    | John Doe     | john@doe.me, jdoe@mail.org | SC, EC     |
|  2 | SC    | Richard Rowe | rowe@mail.us               | SC, EC, HR |
|  3 | SC    | San Zhang    | zhangsan@mail.cn           | SC, HR     |
|  4 | SC    | Taro Yamada  | yamada@mail.jp             | SC, EC, HR |
+----+-------+--------------+----------------------------+------------+

非常感谢您的回答!我很擅长制作真正的应用程序,我觉得这应该是一个非常常见的任务。任何有关指向正确资源的帮助都非常受欢迎!

- 更新:SQLfiddle链接:http://www.sqlfiddle.com/#!9/bc08de/40

1 个答案:

答案 0 :(得分:0)

http://www.sqlfiddle.com/#!9/bc08de/14/0我不太清楚MySQL中的语法,但我已经尝试了这个并得到了这个结果。 1的id有重复。也许是因为一些语法。看看吧 得到了理想的结果。