0

2 つの SQL テーブルがあります。

  1. 最初のテーブルには、部門 ID から学生 ID へのマッピングがあります。(学生は複数の学科に所属する場合があり、学科には多くの学生がいます)。
  2. 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 は、重複を排除する方法も提供します。私が考えることができる1つの方法は、以下のクエリでプログラムによって重複を取得することです:

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 に答える