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));

大功告成!


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);


创建一张简单的表:

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

经验分享 程序员 微信小程序 职场和发展