gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:03:31 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com