GROUP_CONCAT和联接,还如何包括不匹配的行

时间:2018-11-02 13:33:40

标签: mysql group-concat

如何在GROUP_CONCAT中包括不匹配的行?在此,表cls_sec包含分配给类的每个部分。

一个具有 2 部分-' A '和' B ',

两个具有 1个部分' A '

班级三个具有部分。

这里部分是连接表之间关系的关键,但是如何包含第三类,它在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 

如果班级有节,则每个节将显示其关联的班级, else 仅回显班级(如果未将任何节分配给该班级):

所以我在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

1 个答案:

答案 0 :(得分:3)

  • 具有Join条件的OR .. IS NULL需要替换为LEFT JOIN
  • 当您汇总到一行时,最后不需要ORDER BY
  • 使用Coalesce()函数来考虑类没有节的情况。
  • 为了便于理解,我在Group_concat()内添加了Concat()函数。但是,作为suggested by @Raymond Nijland ,我们仍然可以不使用它而工作。
  • 如果要连接的任何子字符串为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