MySQL 如何制作完整的外层

MySQL how to make FULL OUTER

我有4个table,如下。

Table: Class

ClassID     |   ClassSTD
--------------------------------
1           |   STD-1
2           |   STD-2
3           |   STD-3
4           |   STD-4

Table: 部分

SectionId   |   SectionName | ClassId
--------------------------------------------
1           |   sec-A       | 1
2           |   sec-B       | 1
3           |   sec-C       | 1
4           |   sec-A       | 2
5           |   sec-B       | 2
6           |   sec-C       | 2
7           |   sec-A       | 3

Table: 主题

subjectId   |   subjectName
------------------------------------
1           |   Art
2           |   Music
3           |   Play

Table SubjectAllocationToClass

classId     |   sectionID           |   subjectId   | type
-----------------------------------------------------------------------
1(STD-1)        |   1(sec-A)            |   1(Art)      | main
1(STD-1)        |   2(sec-B)            |   1(Art)      | main
1(STD-1)        |   3(sec-C)            |   1(Art)      | optional
1(STD-1)        |   1(sec-A)            |   2(Music)    | main
1(STD-1)        |   2(sec-B)            |   2(Music)    | optional

上方 table "SubjectAllocationToClass" 显示了 class.

部分的两种主题(主要和可选)的分布

需要所有 Class,无论部分或 subjectAllocation 需要所有部分而不考虑 subjectAllocation

我正在尝试进行 Left JOIN、Right JOIN 但无法实现愿望。

如何从 SELECT 语句中获得以下结果?

    classSTD |  sectionName | Main subjectName   | Optional subjectName
    ------------------------------------------------------------------------
    STD-1    |  sec-A       | Art, Music         |
    STD-1    |  sec-B       | Art                |  Music
    STD-1    |  sec-C       |                    |  Art
    STD-2    |              |                    |
    STD-3    |  sec-A       |                    |
    STD-4    |              |                    |



select 
  ClassSTD as ClassSTD, 
  sectionname AS SectionName, 
  COALESCE(GROUP_CONCAT(CASE WHEN sac.type = 'main' THEN subjectName END), '')  as 'Main subjectname',
  COALESCE(GROUP_CONCAT(CASE WHEN sac.type = 'optional' THEN subjectName END), '')  as 'Optional subjectname'
FROM SubjectAllocationToClass sac
JOIN  Class c  ON c.classid = sac.classid
Left JOIN Section sc ON sc.sectionid = sac.sectionid
Left JOIN Subject sj ON  sj.subjectid = sac.subjectid
GROUP BY ClassSTD, SectionName;

不需要使用FULL OUTER JOIN,直接使用LEFT JOINSUBQUERY[即可实现=21=]

试试这个:

SELECT C.ClassSTD, 
       COALESCE(A.SectionName, '') AS SectionName, 
       COALESCE(A.Mainsubjectname, '') AS 'Main subjectname',
       COALESCE(A.Optionalsubjectname, '') AS 'Optional subjectname'
FROM Class C
LEFT JOIN ( SELECT sc.classId AS classId, 
                   sc.sectionname AS SectionName, 
                   COALESCE(GROUP_CONCAT(CASE WHEN sac.type = 'main' THEN subjectName END), '')  AS Mainsubjectname,
                   COALESCE(GROUP_CONCAT(CASE WHEN sac.type = 'optional' THEN subjectName END), '')  AS Optionalsubjectname
            FROM Section sc
            LEFT JOIN SubjectAllocationToClass sac ON sc.sectionid = sac.sectionid
            LEFT JOIN SUBJECT sj ON  sj.subjectid = sac.subjectid
            GROUP BY sc.classId, sc.SectionName
          ) AS A ON C.classId = A.classId;

对于您的第二个查询::

SELECT C.ClassSTD, 
       COALESCE(A.SectionName, '') AS SectionName, 
       COALESCE(A.Mainsubjectname, '') AS 'Main subjectname',
       COALESCE(A.Optionalsubjectname, '') AS 'Optional subjectname'
FROM Class C
LEFT JOIN ( SELECT sc.classId AS classId, 
                   sc.sectionname AS SectionName, 
                   COALESCE(GROUP_CONCAT((CASE WHEN sac.type = 'main' THEN subjectName END) ORDER BY subjectName), '')  AS Mainsubjectname,
                   COALESCE(GROUP_CONCAT((CASE WHEN sac.type = 'optional' THEN subjectName END) ORDER BY subjectName), '')  AS Optionalsubjectname
            FROM Section sc
            LEFT JOIN SubjectAllocationToClass sac ON sc.sectionid = sac.sectionid
            LEFT JOIN SUBJECT sj ON  sj.subjectid = sac.subjectid
            GROUP BY sc.classId, sc.SectionName
          ) AS A ON C.classId = A.classId;