group\u concat和join,如何包含不匹配的行呢

csga3l58  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(324)

如何在中包含不匹配的行 GROUP_CONCAT ? 来,table cls_sec 包含分配给类的每个部分。
一级有2节-“a”和“b”,
二班有一节“a”
三班没有课。
在这里,节是连接表之间关系的关键,但我如何才能包括在表中没有节的类3呢 GROUP_CONCAT 结果。
cls -班级名单

id  |   ttl
===========
1   |   One
2   |   Two
3   |   Three

sec -章节列表

id  |   ttl
===========
1   |   A
2   |   B

cls_sec -分配给班级的每个部分的列表

id  |   c_id|   s_id    
=====================
1   |   1   |   1
2   |   1   |   2
3   |   2   |   1

根据中的行 cls_sec ,我的期望如下:,

1.One-B,1.One-A,2.Two-A,3.Three

如果类具有节,则每个节都将与其关联的类一起显示,否则仅回显类(如果任何节未分配给此类):
所以我在mysql中选择匹配行还是空行
mysql代码

SELECT
    GROUP_CONCAT(DISTINCT cls.id,'.',cls.en_ttl, '-', sec.en_ttl 
                 ORDER BY cls.id) AS cls
FROM
    cls
LEFT JOIN
    cls_sec ON cls_sec.c_id = cls.id
JOIN
    sec ON sec.id = cls_sec.s_id OR cls_sec.s_id is NULL 
ORDER BY cls.id DESC

但我越来越

1.One-B,1.One-A,2.Two-A,3.Three-B,3.Three-A
ltskdhd1

ltskdhd11#

JoinOR .. IS NULL 条件需要替换为 LEFT JOIN .
没有必要 ORDER BY 最后,当您聚合到一行时。
使用 Coalesce() 函数来考虑类没有节时的情况。
我补充说 Concat() 内部函数 Group_concat() ,以便于理解。然而,正如建议的那样by@raymond 尼兰德,不用它我们还是可以工作的。 Concat() 函数返回 null ,如果要连接的任何子字符串 null . 所以,当没有区域时,我们需要移动 - 进入 Concat() ,以避免任何拖尾 - 在字符串中。
尝试:

SELECT
    GROUP_CONCAT(CONCAT(cls.id,'.',cls.en_ttl, 
                        COALESCE(CONCAT('-',sec.en_ttl), ''))  
                 ORDER BY cls.id) AS cls
FROM
    cls
LEFT JOIN
    cls_sec ON cls_sec.c_id = cls.id
LEFT JOIN
    sec ON sec.id = cls_sec.s_id

相关问题