mysql set查询_mysql中的 IN和FIND_IN_SET的查询问题

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

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

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

实际上这样是不行的,这样只有当'daodao'是list中的第一个元素(我测试的时候貌似是第一个也是不行的,只有当list字段的值等于daodao时才是对的)时,查询才有效,否则都的不到结果,即使'daodao'真的再list中

测试代码:

CREATE TABLE `test` (

`id` int(8) NOT NULL auto_increment,

`name` varchar(255) NOT NULL,

`list` varchar(255) NOT NULL,

PRIMARY KEY  (`id`)

)

INSERT INTO `test` VALUES (1, 'name', 'daodao,xiaohu,xiaoqin');

INSERT INTO `test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin');

INSERT INTO `test` VALUES (3, 'name3', 'xiaoqin,daodao,xiaohu');

test1:sql = select * from `test` where 'daodao' IN (`list`);

得到结果空值.

test2:sql = select * from `test` where FIND_IN_SET('daodao',`list`);

得到三条数据。

编辑     删除     1     name     daodao,xiaohu,xiaoqin

编辑     删除     2     name2     xiaohu,daodao,xiaoqin

编辑     删除     3     name3     xiaoqin,daodao,xiaohu

修改表数据

update `test` set `list`='daodao' where `id`='1';

然后执行test1的sql,可以返回一条结果。

再来看看这个:

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()函数

FIND_IN_SET(str,strlist)

假如字符串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');

-> 2

延伸用法,利用FIND_IN_set排序

eg:

$ids = '9,3,45,1,8,2,6';

$sql = "... WHERE goods_id IN('{$ids}') ORDER BY FIND_IN_SET(goods_id, '{$ids}')";

转载:http://blog.sina.com.cn/s/blog_5b5460eb0100e5r9.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<h3>回答1:</h3><br/>find_in_set函数是MySQL的一个字符串函数,用于在一个逗号分隔的字符串列表查找一个指定的字符串,并返回其在列表的位置。例如,find_in_set('a', 'a,b,c,d')将返回1,因为字符串'a'在列表的第一个位置。 在实际应用,find_in_set函数通常用于查询某个字段是否包含指定的值。例如,可以使用以下语句查询包含'apple'的记录: SELECT * FROM fruits WHERE find_in_set('apple', fruits_list) > ; 其,fruits_list是一个逗号分隔的字符串列表,包含了所有水果的名称。如果某个记录的fruits_list字段包含了'apple',则该记录将被返回。 需要注意的是,find_in_set函数只能用于逗号分隔的字符串列表,如果列表使用了其他分隔符,该函数将无法正常工作。 <h3>回答2:</h3><br/>find_in_setmysql的一种字符串处理函数,用于在指定的字符串查找指定值是否存在,并返回其在字符串的位置。该函数可以用于将逗号分隔的字符串的值与另一个值进行比较。其语法如下: find_in_set(str,strlist) 其,str是要搜索的字符串,strlist是要搜索的逗号分隔的字符串。 比如说,如果我们有一个students表,其有一个名为hobby的字段,其记录着每个学生的兴趣爱好,多个兴趣爱好之间用逗号隔开,我们希望查询所有喜欢篮球的学生,可以使用如下的sql语句: select * from students where find_in_set('篮球', hobby) > 0; 该语句会返回所有喜欢篮球的学生的记录。如果使用其他的比较符号,比如=、<、>等,可能会出现查询不正确的情况。 需要注意的是,find_in_set函数的性能比较差,因为要对逗号分隔的字符串进行分割,而且只能进行全文搜索。如果有更好的查询条件,建议使用其他的查询方式进行检索。 <h3>回答3:</h3><br/>MySQL的find_in_set函数就是用于在指定字段查找一组值的某一个值是否存在。在MySQL,find_in_set的语法如下: find_in_set('要查找的值','要查询的字段') 其,要查询的字段必须是逗号分隔的多个值,可以是字符串或数字。 find_in_set函数的返回值是布尔值,如果查找到指定值则返回1,否则返回0。因此,在使用find_in_set函数时,最好将查询结果用IF语句进行判断和排序。 在实际开发,find_in_set函数通常用于查询带有单选框或多选框的表单数据。例如,假设有一个存储用户兴趣爱好的表格user表,包含两个字段:user_id和interests,而interests字段是一个逗号分隔的字符串,存储用户选择的兴趣爱好。如下: user_id | interests ------- | --------- 1 | 音乐,电影,篮球 2 | 篮球,足球,游戏 3 | 游泳,阅读,旅游 如果想查询所有选择了篮球这个兴趣爱好的用户,则可以使用如下SQL语句: SELECT user_id FROM user WHERE FIND_IN_SET('篮球',interests) > 0; 该SQL语句会返回user_id为1和2的用户,因为他们都选择了篮球作为兴趣爱好。 总结:find_in_set函数是MySQL非常实用的一个查询函数,可以用于查询带有单选框或多选框的表单数据。需要注意的是,在使用find_in_set函数时,要确保指定的字段是以逗号分隔的多个值,否则查询结果可能会出现错误。同时,在查询结果需要使用IF语句进行判断和排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值