mysql之GROUP_CONCAT查询结果因in查询条件失效的问题

查询语句:

SELECT
    k.title AS "知识标题",
    kc.categoryName AS "分类",
    k.updateTime AS "更新时间",
    k.employeeName AS "创建人",
    (
    SELECT
        group_concat( employeeName ) 
    FROM
        employee 
    WHERE id
in(substring( k.viewEmployeeIds, 2, length( k.viewEmployeeIds )- 2 ))) AS "可见人"
FROM
    knowledge k
    LEFT JOIN knowledgecategory kc ON k.knowledgeCategoryId = kc.id 
WHERE
    k.companyId = 981 
    AND k.isDeleted = 0;

查询结果如下:

子查询的查询结果如下
但是意外的是,当我进行整体的查询时,只查出了一条数据
而我将结果直接放入时,结果有6条数据


原因:
子查询中使用GROUP_CONCAT函数作为条件返回,mysql会将结果当成字符串处理,而in的分割方法是以**","**为分割的,当返回条件做完一个字符串传入时,其中的,会被当成一个字符处理,从而MySQL会自动的判断字符串的第一个是否匹配,但是后面的就截掉了 没有进行匹配!,只能查出符合第一个的数据。

解决方案:
使用find_in_set函数 替代in的使用

修改之后的sql如下:

SELECT
    k.title AS "知识标题",
    kc.categoryName AS "分类",
    k.updateTime AS "更新时间",
    k.employeeName AS "创建人",
    (
    SELECT
        group_concat( employeeName )
    FROM
        employee
    WHERE companyId = 981 AND
        FIND_IN_SET(id, substring( k.viewEmployeeIds, 2, length( k.viewEmployeeIds )- 2 ))
) AS "可见人",
                substring( k.viewEmployeeIds, 2, length( k.viewEmployeeIds )- 2 ) as "可见人Ids"
FROM
    knowledge k
    LEFT JOIN knowledgecategory kc ON k.knowledgeCategoryId = kc.id
WHERE
    k.companyId = 981
    AND k.isDeleted = 0;

修改之后即可查出所有的数据。

注解补充:
find_in_set 函数的使用及其原理:
find_in_set(a,x):a为某个字符串或字段,x为一个字符串,当a在x了里面时会满足条件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
group_concatMySQL中的一个聚合函数,用于将多行数据按照指定的分隔符连接成一行返回。最简单的用法是将某个字段的值连接在一起,可以通过在group_concat函数中指定要连接的字段来实现。例如,使用group_concat(price)可以将表中price字段的值按照逗号分隔连接成一行返回。 如果想要对连接后的结果进行排序,可以使用Order BY子句,并在group_concat函数中指定排序字段以及排序顺序。例如,使用group_concat(price ORDER BY price DESC)可以将连接后的结果按照price字段降序排列。 另外,还可以使用DISTINCT关键字来去重,使用Separator关键字来指定连接的分隔符。例如,使用group_concat(DISTINCT price SEPARATOR ';')可以将连接后的结果按照分号分隔,并去除重复的值。 总结来说,group_concat函数可以根据指定的字段条件将多行数据连接成一行返回,并可以通过排序、去重和指定分隔符来满足不同的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [mysqlgroup_concat函数详解](https://blog.csdn.net/bobozai86/article/details/119858193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值