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 JOIN和SUBQUERY[即可实现=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;
我有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 JOIN和SUBQUERY[即可实现=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;