如何在 GROUP_CONCAT
中包含不匹配的行?此处,表 cls_sec
包含分配给类的每个部分。
One 类有 2 部分 - 'A' 和 'B ',
Two 类有 1 个部分 'A'
三 类有无 部分。
这里的部分是连接表之间关系的关键,但是我如何在 GROUP_CONCAT
结果中包含没有部分的 class three。
表 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
最佳答案
Join
withOR .. IS NULL
条件需要替换为LEFT JOIN
。- 当您聚合成一行时,最后不需要
ORDER BY
。 - 使用
Coalesce()
函数来考虑类没有部分的情况。 - 我已经添加了
Concat()
Group_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
关于mysql - GROUP_CONCAT 和连接,如何也包含不匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53119563/