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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值