【问题标题】:GROUP_CONCAT and join, how to include not matching rows alsoGROUP_CONCAT 和连接,如何也包括不匹配的行
【发布时间】:2018-11-02 13:33:39
【问题描述】:

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

One 类有 2 section - 'A' 和 'B ',

Two 类有 1 个部分 'A'

三类No部分。

这里的部分是连接表之间关系的关键,但我怎样才能包含在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

【问题讨论】:

  • 当您将所有内容汇总到一行时,不需要在末尾使用order by
  • 你能提供Create Table的声明吗?或 SQL 小提琴 / DB 小提琴。这有助于加快测试速度。

标签: mysql group-concat


【解决方案1】:
  • JoinOR .. 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

【讨论】:

  • 查询接缝正常 +1,但“您在 Group_concat() 中缺少 Concat() 函数。”它不是真的需要 GROUP_CONCAT 有点像带有字符串连接的 CONCAT 看到这个db-fiddle.com/f/cpriwCHK4aZqTHH4NX6iFL/1 但我建议在使用GROUP_CONCAT(DISTINCT ...)时使用CONCAT
  • @RaymondNijland (facepalm) - MySQL 及其不断增加的速记技巧列表 :-| ;谢谢你的提示。我将编辑我的解释,但我更愿意保留 Concat() 的用法,因为它使代码易于理解。
  • @MadhurBhaiya,谢谢伙计!,以前不知道COALESCE,有新的话题要学习。
  • @AnandHmt 乐于提供帮助 :) 附加提示:- MySQL 提供了更多类似于 Coalesce() 的功能:Ifnull()NullIf()。参考:dev.mysql.com/doc/refman/8.0/en/control-flow-functions.html
猜你喜欢
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2014-07-20
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
相关资源
最近更新 更多