2013-04-12 82 views
0

我有2個SQL表。MYSQL - GROUP_CONCAT只顯示重複項

  1. 第一個表格具有department-ids到student-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; 

有沒有辦法單獨保存副本?即使在這個查詢中,也歡迎任何優化。謝謝!

+1

由你自己先嚐試寫作查詢。如果您有任何錯誤,請在此處詢問。 – Neo

+0

對不起。我的錯。也會更新它們。 – Anonymous

回答

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