当没有匹配的记录时,如何将与另一个表连接的 group_concat 列更改为空字符串而不是 null?

Posted

技术标签:

【中文标题】当没有匹配的记录时,如何将与另一个表连接的 group_concat 列更改为空字符串而不是 null?【英文标题】:How can I change a group_concat column that's left joined with another table to empty string instead of null when there are no matching records? 【发布时间】:2021-12-01 13:04:45 【问题描述】:

我一直在尝试获取一个 mysql 查询,该查询使用左连接和 group_concat 组合来获取给定用户的所有个人资料照片的 Amazon S3 路径。我想要的是当用户没有个人资料图片时,作为 group_concat() 函数结果的 photo_keys 聚合列变为空字符串而不是 null。

有很多类似的问题,其中列的值取决于某些条件(即使用 case/when 语句或 if 语句),但它们没有将 group_concat 与左连接结合起来的复杂因素.

我开始的内容(工作代码,但不是所需的行为 => 当用户没有个人资料图片时,photo_keys 为 null 而不是空字符串)

SELECT u.*, GROUP_CONCAT(pps.photo_key ORDER BY pps.is_primary DESC) as photo_keys
        FROM users u 
        LEFT JOIN profile_images pps ON u.id=pps.user_id
        WHERE u.id = "555555555"
        GROUP BY u.id`

我尝试过的(这更像是伪代码)

SELECT u.*, GROUP_CONCAT(pps.photo_key ORDER BY pps.is_primary DESC) as photo_keys, COUNT(*) as numImages
        CASE 
              WHEN numImages = 0 THEN photo_keys = ""
        END
        FROM users u 
        LEFT JOIN profile_images pps ON u.id=pps.user_id
        WHERE u.id = "5555555555"
        GROUP BY u.id`

非常感谢您的帮助。 -杰

【问题讨论】:

【参考方案1】:

用 IFNULL 包装结果即可。

SELECT u.*, IFNULL(GROUP_CONCAT(pps.photo_key ORDER BY pps.is_primary DESC), '') as photo_keys
FROM users u 
LEFT JOIN profile_images pps ON u.id=pps.user_id
WHERE u.id = "555555555"
GROUP BY u.id`

【讨论】:

以上是关于当没有匹配的记录时,如何将与另一个表连接的 group_concat 列更改为空字符串而不是 null?的主要内容,如果未能解决你的问题,请参考以下文章

SQL连接查询

如何通过将一个表中的 id 与另一个表匹配来选择和更新一个表中的记录?

当存在 NULL 时,性能选择与另一个表中的条目不匹配的行

当引用表中没有匹配的记录时,delete语句如何与REFERENCE约束冲突?

如何将同一表中的一条记录与另一条记录关联?

从一个表返回与另一表不匹配的单行