mysql中FIND_IN_SET的使用方法以及in、find_in_set、like的区别

学习笔记 2017/11/03 MYSQL, PHP

        在mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更精准,这时候mysql的FIND_IN_SET函数就派上用场了。

        有了FIND_IN_SET这个函数。我们可以设计一个如:一只手机即是智能机,又是Andriod系统的。

比如:有个产品表里有一个type字段,他存储的是产品(手机)类型,有 1、智能机,2、Andriod系统,3、小米系统,4、1000元以下

现在有条手机的记录即是1000元以下的,又是智能机,还是Andriod的系统。

type中以 4,1,2的格式存储.

那们我们如何用sql查找所有type中有4的1000元以下的手机呢,

这就要我们的find_in_set出马的时候到了.

先看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。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。


mysql> SELECT FIND_IN_SET(\'b\',\'a,b,c,d\');


+----------------------------+


| FIND_IN_SET(\'b\',\'a,b,c,d\') |


+----------------------------+


|                          2 |


+----------------------------+


1 row in set (0.00 sec)


用起来很简单


就以上面我说到的情况来举例:


以下为实际应用当中的SQL语句:


select * from mobile where FIND_IN_SET(\'4\',type);


这个就可以找出所有1000元以下手机的记录!

查询表字段 pingid = (1,2,3,)


SELECT * FROM `linkinfo` WHERE `pingid` REGEXP \'{id},\' AND `pingid` NOT REGEXP \'[[:alnum:]]+{id},\'   使用上面的语句,可以查询出来


用FIND_IN_SET() 更简单


SELECT * FROM linkinfo WHERE FIND_IN_SET( \'1\', pingid )


 

原来以为mysql可以进行这样的查询

select id, list, name from table where \'daodao\' IN (list);      (一)

注:1. table含有三个字段id:int, list:varchar(255), name:varchar(255)


实际上这样是不行的,这样只有当name是list中的第一个元素时,查询才有效,否则都的不到结果,即使\'daodao\'真的再list中


再来看看这个:

select id, list, name from table where \'daodao\' IN (\'libk\', \'zyfon\', \'daodao\');    (二)

这样是可以的

---------------------------------------------------------


这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。


原因其实是(一)中 (list)    list是变量, 而(二)中 (\'libk\', \'zyfon\', \'daodao\')是常量


所以如果要让(一)能正确工作,需要用find_in_set():

select id, list, name from table where FIND_IN_SET( \'daodao\' , list); (一)的改进版。


总结:所以如果list是常量,则可以直接用IN, 否则要用FIND_IN_SET()函数


SQL 语句中的in、find_in_set、like的区别

1.in查询相当于多个or条件的叠加,例如:

select * from user where user_id in (1,2,3);

等效于

select * from user where user_id = 1 or user_id = 2 or user_id = 3;

not in与in相反,如下

select * from user where user_id not in (1,2,3);

等效于

select * from user where user_id != 1 and user_id != 2 and user_id != 3;

1.find_in_set基本语法

FIND_IN_SET(str,strlist)

str 要查询的字符串,strlist 字段名 参数以”,”分隔 如 (1,2,6,8)

如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。

+----+---------+-----------+-------------+

| id | user_id | follow_id | follow_time |

+----+---------+-----------+-------------+

| 13 | 15      | 16,15     |  1478096138 |

| 14 | 15      | 17        |  1478177725 |

| 15 | 15      | 19        |  1478181035 |

+----+---------+-----------+-------------+

比如这张表,SELECT * from test where FIND_IN_SET(\'5\',follow_id);这样是查不到的,返回值为null,因为follow_id中没有”5”这个值,它不同于 like 模糊查询,它是以“,”来分隔值

like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔


本文地址:https://www.stayed.cn/item/48

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。