我有 2 个 SQL 表。
- 第一个表有一个部门 ID 到学生 ID 的映射。(一个学生可能属于多个系,一个系有很多学生)。
- 第二个表有学生和他们的爱好的映射。(也有多对多的关系)
表的示例快照:
DESC DEPARTMENT_STUDENTS;
----------------------------
DEPT_ID STUDENT_ID
----------------------------
Physics 123
Mathematics 111
Physics 111
CS 45
CS 56
Mathematics 89
DESC STUDENTS_HOBBIES;
-------------------------------
STUDENT_ID HOBBY
-------------------------------
111 Skiing
111 Singing
111 Browsing
123 Singing
123 Browsing
123 Reading
45 Origami
56 Origami
56 Making Prank Calls
89 Reading
我正在寻找一个查询,该查询将提供每个部门所有学生的共同爱好列表。所需的输出如下所示:
-----------------------------------------
DEPT_ID GROUP_CONCAT(...)
-----------------------------------------
Physics (Singing, Browsing)
Mathematics ()
CS (Origami)
我快到了,在稍微摆弄一下 MySQL 之后,我能够将一个部门的所有(不是常见的)爱好归为一组。GROUP_CONCAT 还提供了消除重复项的方法。我能想到的一种方法是通过以下查询以编程方式检索重复项:
SELECT DEPT_ID, GROUP_CONCAT(OP.HOBBIES) FROM DEPARTMENT_STUDENTS DS
INNER JOIN (SELECT STUDENT_ID, GROUP_CONCAT(HOBBY)AS HOBBIES FROM STUDENTS_HOBBIES
GROUP BY STUDENT_ID) OP
ON OP.STUDENT_ID = DS.STUDENT_ID
GROUP BY DS.DEPT_ID;
有没有办法单独保留重复项?即使在此查询中,也欢迎任何优化。谢谢!