上周遇见一个需求,有这样一棵树:
点击上级,展现所有子集,点击集团,显示所有产线(例子)
这个时候有两种方式:
添加产线时,将集团、事业部、公司、车间的id存起来。
然后点击查询时,将不同的id带入。
这样做的缺点就是,查询会很麻烦,区分查询。
另一种是:
一个treePath字段,存放树路径id:
集团id,事业部id,公司id,车间id,产线id
例子:点击集团时,将集团id和treePath进行in比较。如果包含,就说明是这个集团的数据。
sql
CONCAT (',',tree_path,',' ) LIKE CONCAT( '%,',集团id,',%' )
先将源数据加一个左右各一个逗号,保证不会出现这种情况!!!
treePath:1001,221,333
集团id:10
挖槽,直接GG
1001也符合!!
所以我们左右各加一个逗号变成:
treePath:,1001,221,333,
集团id:,10,
哈哈哈哈哈哈哈,这样就不会出现那种情况了,我真是天才啊!
用正则就是这样:
sql
CONCAT (',',tree_path,',') REGEXP ',(集团id),'
话不多说,直接上态度:
sql
select *from `user` as u where u.`name` REGEXP 'ab?c';-- c出现0次或者1次
select *from `user` as u where u.`name` REGEXP 's*c';-- s出现0次或者多次
select *from `user` as u where u.`name` REGEXP 'ab+c';-- b出现1次以上的字符
select *from `user` as u where u.`name` REGEXP 'a.c';-- 以a开始,c结束。.可以代表无数个,相当于模糊查询的%
select *from `user` as u where u.`name` REGEXP 'b{2,}';-- b连续出现2次以上
select *from `user` as u where u.`name` REGEXP 'b{2}';-- b连续出现2次
select *from `user` as u where u.`name` REGEXP 'b{2,3}';-- b连续出现2-3次
select *from `user` as u where u.`name` REGEXP 'b{2}|a{3}';-- b连续出现2次或者a连续出现3次
select *from `user` as u where u.`name` REGEXP '[acs]';-- 包含这三个字母组成
select *from `user` as u where u.`name` REGEXP '[a-b]';-- 包含a-c组成
select *from `user` as u where u.`name` REGEXP '^a';-- 以a开头
select *from `user` as u where u.`name` REGEXP 's$';-- 以c结尾