MySQL手册中find_in_set函数的语法:
FIND_IN_SET(str,strlist)
str 要查询的字符串
strlist 字段名 参数以”,”分隔 如 (1,2,6,8)
查询字段(strlist)中包含(str)的结果,返回结果为null或记录
假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。
select * from company
where `status` = 1
and FIND_IN_SET('36205',parent_ids)
;
find_in_set()和in的区别:
弄个测试表来说明两者的区别
这样只有当parent_ids字段的值等于’36205’时(和IN前面的字符串完全匹配),查询才有效,否则都得不到结果,即使’36205’真的在parent_ids中。
这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。原因其实是(一)中 (parent_ids) parent_ids是变量, 而(二)中 (32428,36205,36209)是常量。
所以如果要让(一)能正确工作,需要用find_in_set();
所以如果list是常量,则可以直接用IN, 否则要用find_in_set()函数。
find_in_set()和like的区别:
在mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更精准,这时候mysql的FIND_IN_SET函数就派上用场了,下面来看一个例子
like会把2和22都会查出来,而find_in_set就不会
ike是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果