1、业务背景
公司的业务需求是需要分权限分等级的获取不同的内容,因为原来的角色,权限,分组表已经建好,但是又要实现不同产品需要不同等级不同分组的人员管理,在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更精准,查找资料后发现涉及到数据库的特有函数,候mysql的FIND_IN_SET函数就派上用场了,下面来具体了解一下。
2、表设计
数据库字段部分截图:
SELECT t.dept_id FROM sys_dept t WHERE FIND_IN_SET (102,ancestors)
疑问01:where 后面这跟的是条件吗?疑问02:find_in_set()这怎么用呢?
3、探得究竟
贴图:
SELECT t.dept_id FROM sys_dept t WHERE 0
SELECT t.dept_id FROM sys_dept tWHERE -1
SELECT t.dept_id FROM sys_dept t WHERE 12
问题总结
其实我们大家都知道,where 后面跟随各种查询条件,但是从来没有这么写过,即便是应对开发,也很少有人写到。其实where 类似于 if 就是对条件的判断,返回 true or false。在检索过程中,将满足条件的,即条件为true的结果返回。where能实现类型转换,这一点十分类似JavaScript中的if语句的用法。
4、原来如此
众里寻它千百度,sodesiga,好吧!原来就是个这。
FIND_IN_SET(str,strlist)
第一个参数str是要查找的字符串。
第二个参数strlist是要搜索的逗号分隔的字符串列表。
贴图:
SELECT FIND_IN_SET(1,1)
刚说好的字符串,你就给我来个这,mysql你怎么可以这么随意呢!
以上图示,有劳读友自行总结
1SELECT t.dept_id,t.parent_id,t.ancestors2FROM sys_dept t WHERE 3FIND_IN_SET (dept_id,'100,101,102,')
将dept_id,依次等于100,101,102的结果,返回。类似于In 集合操作
1SELECT t.dept_id,t.parent_id,t.ancestors 2FROM sys_dept t WHERE 3dept_id in (100,101,102)
5、FIND_IN_SET和like的区别
like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。