mysql使用GROUP_CONCAT做完查询条件导致in失效的解决方案

mysql使用GROUP_CONCAT做完查询条件导致in失效的解决方案

我需要查出hr_perf_forced_distribution_org表中uuid在子查询中出现过的,
查询语句如下
SELECT * FROM hr_perf_forced_distribution_org WHERE UUID IN ( SELECT GROUP_CONCAT(t1.uuid) as uuid FROM hr_perf_forced_distribution_org t1 WHERE t1.corp_id = 26 AND t1.model_id = 1 AND t1.active_id = 5000000278302118 AND t1.org_id NOT IN (7790) )

子查询的查询结果如下
在这里插入图片描述

但是意外的是,当我进行整体的查询时,只查出了一条数据

在这里插入图片描述

而我将结果直接放入时,结果有三条数据

在这里插入图片描述

原因:

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

即原本的5000000278436301,5000000278436306,5000000278438296结果会被当初
‘5000000278436301,5000000278436306,5000000278438296’一个字符串 处理

解决方案:

使用find_in_set函数 替代in的使用

修改之后的sql如下:

  SELECT uuid FROM hr_perf_forced_distribution_org
        WHERE find_in_set(uuid,
      (SELECT GROUP_CONCAT(t1.uuid)  as uuid
            FROM hr_perf_forced_distribution_org t1
            WHERE t1.corp_id = 26
            AND t1.model_id =  1
            AND t1.active_id = 5000000278302118
            AND t1.org_id NOT IN (7790)
      ) )

修改之后即可查出所有的数据
在这里插入图片描述

find_in_set 函数的使用及其原理:
find_in_set(a,x)
a为某个字符串或字段,x为一个字符串
当a在x了里面时会满足条件
例如:
select find_in_set(”长沙,”长沙,上海,北京“)
#-- 这里返回的就是位置下标1

注意点:第二个参数无论是字符串还是数字都必须用单引号括起来, 并且字符串列表是用逗号隔开,是一个字符串列表整体要是不这样写 会报语法错误!


补充:find_in_set 也可以进行like模糊查询
当我们需要查询某个字段里面包含某个字符串的时候
like的写法为
SELECT * FROM users WHERE users.limits LIKE '%2%'

find_in_set 的写法为

SELECT * FROM users WHERE FIND_IN_SET(2,users.limits)

其中limits必须以,为分隔符
like是广泛的模糊匹配,字符串中没有分隔符,

find_in_set是精确匹配,字段值以英文”,”分隔,find_in_set查询的结果要比like查询更加精确!

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值