0

我有 2 个 SQL 表。

  1. 第一个表有一个部门 ID 到学生 ID 的映射。(一个学生可能属于多个系,一个系有很多学生)。
  2. 第二个表有学生和他们的爱好的映射。(也有多对多的关系)

表的示例快照:

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; 

有没有办法单独保留重复项?即使在此查询中,也欢迎任何优化。谢谢!

4

1 回答 1

0

干得好:

SELECT DEPT_ID, GROUP_CONCAT(HOBBY) FROM (
SELECT 
d.DEPT_ID
, s.HOBBY
FROM
department_students d
INNER JOIN students_hobbies s USING(STUDENT_ID)
GROUP BY d.DEPT_ID, s.HOBBY
HAVING COUNT(DISTINCT s.STUDENT_ID) > 1
)sq 
GROUP BY DEPT_ID
于 2013-04-12T14:02:05.760 回答