简体   繁体   English

MYSQL-GROUP_CONCAT仅显示重复项

[英]MYSQL - GROUP_CONCAT show duplicates only

I have 2 SQL tables. 我有2个SQL表。

  1. The first table has a mapping of department-ids to student-ids. 第一个表具有部门ID到学生ID的映射。 (A student may belong to more than one department and a department has many students). (一个学生可能属于多个部门,一个部门有很多学生)。
  2. The second table has a mapping of students and their hobbies. 第二张桌子绘制了学生及其爱好的地图。 (which also has a many to many relationship) (也有多对多的关系)

Sample Snapshots of tables: 表的示例快照:

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

I am looking for a query that will provide a list of common hobbies among all the students per department. 我正在寻找一个查询,该查询将提供每个系所有学生之间的共同爱好列表。 Required output would look like : 所需的输出如下所示:

-----------------------------------------
     DEPT_ID         GROUP_CONCAT(...)
-----------------------------------------
    Physics          (Singing, Browsing)
    Mathematics      ()
    CS               (Origami)

I am almost there and after a little bit of fiddling around with MySQL, I was able to group ALL(not the common ones) the hobbies of a department. 我快到了,经过一点点MySQL的摆弄之后,我就能够将所有(不是普通的)部门的爱好归为一组。 GROUP_CONCAT provides ways to eliminate duplicates also. GROUP_CONCAT还提供了消除重复项的方法。 One way that I could think of , is to retrieve duplicates programatically over the query below: 我可以想到的一种方法是通过以下查询以编程方式检索重复项:

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; 

Is there a way to preserve duplicates alone? 有没有办法单独保留重复项? Even in this query, any optimizations are welcome. 即使在此查询中,也欢迎进行任何优化。 Thanks! 谢谢!

Here you go: 干得好:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM