首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL逗号分隔的结果有两种类型

MYSQL逗号分隔的结果有两种类型
EN

Stack Overflow用户
提问于 2015-12-28 19:16:49
回答 2查看 22关注 0票数 0

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

表:

代码语言:javascript
复制
ClassID     |   ClassSTD
--------------------------------
1           |   STD-1
2           |   STD-2
3           |   STD-3
4           |   STD-4

表:

代码语言:javascript
复制
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

表:Subject

代码语言:javascript
复制
subjectId   |   subjectName
------------------------------------
1           |   Art
2           |   Music
3           |   Play

SubjectAllocationToClass

代码语言:javascript
复制
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需要所有区段而不需要subjectAllocation

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

代码语言:javascript
复制
    classSTD |  sectionName | Main subjectName   | Optional subjectName
    -----------------------------------------------------------------------------
    STD-1    |  sec-A       | Art, Music         |
    STD-1    |  sec-B       | Art                |  Music
    STD-1    |  sec-C       |                    |  Art
    STD-3    |  sec-A       |                    |
    STD-4    |              |                    |
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-28 19:55:08

代码语言:javascript
复制
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
JOIN Section sc ON sc.sectionid = sac.sectionid
JOIN Subject sj ON  sj.subjectid = sac.subjectid
GROUP BY ClassSTD, SectionName;
票数 0
EN

Stack Overflow用户

发布于 2015-12-28 19:31:49

可以使用GROUP_CONCAT()CASE表达式进行条件分组,如下所示

代码语言:javascript
复制
select c.ClassID, s.sectionName,
xx.`Main subjectName`,
xx.`optional subjectName`
from Class c
join Section ss on c.ClassID  = ss.ClassID     
join (
select sa.sectionID,
group_concat(case when sa.type = 'main' then s.subjectName else null end) as  `Main subjectName`,
group_concat(case when sa.type = 'optional' then s.subjectName else null end) as  `optional subjectName`
from SubjectAllocationToClass sa
join Subject s on sa.subjectId = s.subjectId   
group by sa.subjectId ) xx on ss.SectionId = xx.SectionId;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34499359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档