GROUP_CONCAT 并加入,如何也包括不匹配的行

GROUP_CONCAT and join, how to include not matching rows also

如何在 GROUP_CONCAT 中包含不匹配的行?这里,Table cls_sec 包含分配给 class 的每个部分。

Class一个2-'A' 和 'B',

Class Two1 Section 'A'

Class节。

这里的部分是连接表之间关系的关键,但是我如何在 GROUP_CONCAT 结果中包含没有部分的 class 三个

Table cls - Class

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

Table sec - 部分列表

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

Table cls_sec - 分配给 Class

的每个部分的列表
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 

如果 class 有部分,每个部分将显示其关联的 class,else 仅回显 class(如果任何部分有'分配给这个 class) :

那么我在 mysql select 中做了什么,如果匹配行或空行

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
  • Join with OR .. IS NULL 条件需要替换为 LEFT JOIN.
  • 当你聚合成一行时,最后不需要 ORDER BY
  • 使用Coalesce() 函数来考虑class 没有部分的情况。
  • 我已经添加了Concat() function inside the Group_concat(), for ease of understandability. However, as @Raymond Nijland,我们不使用它仍然可以工作
  • Concat() 函数 returns 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