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