两个不同表上的group_concat在第二个表上给出重复的结果

San*_*ing 1 mysql left-join group-concat

考虑三个实体作为学生,课程,主题以下是协会 -

student has_many courses,
student has_many subjects.
Run Code Online (Sandbox Code Playgroud)

现在我想使用mysql group_concat,主题名称和课程名称,在课程上左连接,在主题上左联接和group_by student_id获取学生记录.

问题是,group_concat('subjects.name') as subject_names我给了我重复的主题条目,但group_concat('students.name') as student_names给出了唯一的名称.

为什么?

gbn*_*gbn 9

2个左连接是通过每个学生的子行的笛卡尔积乘以行

  • 学生1有3门课程和2门科目
  • 为学生1生成6行
  • course每个受试者一个值=每个过程重复两次
  • subject每门课程给出一个值=每个科目重复三次

修理:

选项1:GROUP_CONCAT(DISTINCT ...)按照MySQL文档使用

在MySQL中,您可以获得表达式组合的连接值.要消除重复值,请使用DISTINCT子句.

选项2:使用UNION ALL +派生表

SELECT
    Student, MAX(CourseConcat), MAX(SubjectConcat)
FROM
    (
    -- 2 separate SELECTs here
    .. student LEFT JOIN course ...
    UNION ALL
    .. student LEFT JOIN subjects...
    ) T
GROUP BY
   Student
Run Code Online (Sandbox Code Playgroud)

第二个选项可能更好,虽然更复杂,因为您使用DISTINCT处理的中间行较少