【问题标题】:MySQL how to make FULL OUTERMySQL如何使FULL OUTER
【发布时间】:2016-01-05 09:01:34
【问题描述】:

我有 4 张桌子,如下所示。

表:

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

表格:部分

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

表格:主题

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

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

上表“SubjectAllocationToClass”显示了两种类型的主题(主要和可选)到班级部分的分布。

需要所有类,而不管部分或主题分配 无论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;

【问题讨论】:

  • 你得到的输出是什么
  • 添加到上面的编辑帖中
  • 创建一个 sqlfiddle 以获得快速帮助。

标签: mysql sql select join left-join


【解决方案1】:

不需要使用FULL OUTER JOIN,可以直接使用LEFT JOINSUBQUERY

来实现

试试这个:

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;

【讨论】:

  • [Err] 1052 - 字段列表中的列 'classId' 不明确
  • [Err] 1054 - 'group statement' 中的未知列 'ClassSTD' 。我从组中删除了 ClassSTD。我得到了结果,但所有部分都没有显示......但我得到了所有课程......我也想要所有部分
  • 检查的错误消失了。但我仍然没有看到所有的部分。有部分,主题尚未分配给部分。 Class ->has->section ->has->subject 我想要所有课程(有或没有部分) - 得到它 我想要所有部分(有或没有主题) - 没有得到它
  • 是否可以按 Main subjectName 和 Optional subjectName col 返回的升序排列?
猜你喜欢
  • 2021-09-06
  • 2022-08-30
相关资源
最近更新 更多