mysql数据库用逗号切割字符串FIND_IN_SET(str,strlist)函数

一 事情缘由

Spring Security有5张表 ,分别是 用户表,角色表,权限表和2张关联表
我们做权限处理时没用关联表,所有在数据库存储时角色对应的权限是


用逗号分隔的字符串
用逗号分隔的字符串


在做表关联查询时,需要把改字符串用逗号切割,来匹配权限表的id,

这不就是切割字符串吗?博主微微一笑,简单!

先获取字符串,返回String类型,用java的String.split(",");
切好后存入集合,
在xml里用<foreach></foreach>
搞定!
在这里插入图片描述
功能是完成了但是非常辣眼睛.

后来老大教的mysql数据有
FIND_IN_SET(str,strlist)
函数可以切割逗号字符串
改成了

SELECT
*
   from user
        where FIND_IN_SET(id, ('1,2,3,4,5,6'));

大功告成!


二 MySQL手册中find_in_set函数的语法:

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


select * from treenodes where FIND_IN_SET(id, ‘1,2,3,4,5’);
使用find_in_set函数一次返回多条记录
id 是一个表的字段,然后每条记录分别是id等于1,2,3,4,5的时候
有点类似in (集合)
select * from treenodes where id in (1,2,3,4,5);


三 find_in_set()和in的区别:

创建一张简单的表:

CREATE TABLE `tb_test` (
  `id` int(8) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `list` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
);

INSERT INTO `tb_test` VALUES (1, 'name', 'daodao,xiaohu,xiaoqin');
INSERT INTO `tb_test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin');
INSERT INTO `tb_test` VALUES (3, 'name3', 'xiaoqin,daodao,xiaohu');

使用IN查询:

SELECT id,name,list from tb_test WHERE 'daodao' IN(list); -- (一)

在这里插入图片描述
发现这样不行,只有当list字段的值等于’daodao’时(和IN前面的字符串完全匹配),查询才有效,否则都得不到结果

再来看看这个:

SELECT id,name,list from tb_test WHERE 'daodao' IN ('libk', 'zyfon', 'daodao'); -- (二)

在这里插入图片描述
这样是可以的。

这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。原因其实是(一)中 (list) list是变量, 而(二)中 (‘libk’, ‘zyfon’, ‘daodao’)是常量。
所以如果要让(一)能正确工作,需要用find_in_set():

SELECT id,name,list from tb_test WHERE FIND_IN_SET('daodao',list); -- (一)的改进版

在这里插入图片描述
总结:
所以如果list是常量,则可以直接用IN, 否则要用find_in_set()函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值