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查询更加精确!