如何在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
答案 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