mysql - GROUP_CONCAT 和连接,如何也包含不匹配的行

标签 mysql group-concat

如何在 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 with OR .. 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/

相关文章:

php - MySQL 将一列求和到 LIMIT 并返回求和值

php - PHP MySQL 函数的 future

MySQL:具有 ORDER BY COUNT 的 GROUP_CONCAT?

php - 修改从mysql中选择数据

php - MYSQL 根据多个不同的列删除

php - 无法在 array_push 中将时间戳转换为日期时间

MySQL 将多个右连接行合并为一列

php - 如何mysql GROUP_CONCAT

sql - SQLite 中的 GROUP_CONCAT

mysql - 当我将数据从 servlet 存储到 mysql 数据库字符(如 "<")时, ">"被存储为 unicode 格式(如 u003c )而不是实际符号