mysql递归查询组织机构 (前端用orgchart 插件
2017-11-30 14:52
274 查看
http://blog.csdn.net/moyanxuan_1993_2_24/article/details/52790314
目录结构:
创建表并添加测试数据
创建表
添加数据
根据父id递归查询所有子节点
创建函数
根据函数查询
根据子id递归查询所有父节点
写sql语句
根据组织机构名称模糊查询所有父节点
创建函数
根据函数查询
CREATE TABLE
PRIMARY KEY (
UNIQUE KEY
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
INSERT INTO
select * from vrv_org_tab;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
注意:大家看到那个10000了吗,就是我们的子节点id。
注意:只支持单个查询,意思是不可以根据两个或者两个以上的子节点同时查询出所有父节点。我们可以看到,上面参数都是单个值进行递归查询的。
西面提供一个函数支持多个查询
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
目录结构:
创建表并添加测试数据
创建表
添加数据
根据父id递归查询所有子节点
创建函数
根据函数查询
根据子id递归查询所有父节点
写sql语句
根据组织机构名称模糊查询所有父节点
创建函数
根据函数查询
创建表,并添加测试数据
创建表
DROP TABLE IF EXISTSvrv_org_tab;
CREATE TABLE
vrv_org_tab(
idbigint(8) NOT NULL AUTO_INCREMENT,
org_namevarchar(50) NOT NULL,
org_levelint(4) NOT NULL DEFAULT ‘0’,
org_parent_idbigint(8) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (
id),
UNIQUE KEY
unique_org_name(
org_name)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
添加数据
INSERT INTOvrv_org_tabVALUES (‘1’, ‘北信源’, ‘1’, ‘0’);
INSERT INTO
vrv_org_tabVALUES (‘2’, ‘北京’, ‘2’, ‘1’);
INSERT INTO
vrv_org_tabVALUES (‘3’, ‘南京’, ‘2’, ‘1’);
INSERT INTO
vrv_org_tabVALUES (‘4’, ‘武汉’, ‘2’, ‘1’);
INSERT INTO
vrv_org_tabVALUES (‘5’, ‘上海’, ‘2’, ‘1’);
INSERT INTO
vrv_org_tabVALUES (‘6’, ‘北京研发中心’, ‘3’, ‘2’);
INSERT INTO
vrv_org_tabVALUES (‘7’, ‘南京研发中心’, ‘3’, ‘3’);
INSERT INTO
vrv_org_tabVALUES (‘8’, ‘武汉研发中心’, ‘3’, ‘4’);
INSERT INTO
vrv_org_tabVALUES (‘9’, ‘上海研发中心’, ‘3’, ‘5’);
INSERT INTO
vrv_org_tabVALUES (‘10’, ‘北京EMM项目组’, ‘4’, ‘6’);
INSERT INTO
vrv_org_tabVALUES (‘11’, ‘北京linkdd项目组’, ‘4’, ‘6’);
INSERT INTO
vrv_org_tabVALUES (‘12’, ‘南京EMM项目组’, ‘4’, ‘7’);
INSERT INTO
vrv_org_tabVALUES (‘13’, ‘南京linkdd项目组’, ‘4’, ‘7’);
INSERT INTO
vrv_org_tabVALUES (‘14’, ‘武汉EMM项目组’, ‘4’, ‘8’);
INSERT INTO
vrv_org_tabVALUES (‘15’, ‘武汉linkdd项目组’, ‘4’, ‘8’);
INSERT INTO
vrv_org_tabVALUES (‘16’, ‘上海EMM项目组’, ‘4’, ‘9’);
INSERT INTO
vrv_org_tabVALUES (‘17’, ‘上海linkdd项目组’, ‘4’, ‘9’);
select * from vrv_org_tab;
根据父id递归查询所有子节点
创建函数
create function getChildrenOrg(orgid INT) returns varchar(4000) BEGIN DECLARE oTemp VARCHAR(4000); DECLARE oTempChild VARCHAR(4000); SET oTemp = ''; SET oTempChild = CAST(orgid AS CHAR); WHILE oTempChild IS NOT NULL DO SET oTemp = CONCAT(oTemp,',',oTempChild); SELECT GROUP_CONCAT(id) INTO oTempChild FROM vrv_org_tab WHERE FIND_IN_SET(org_parent_id,oTempChild) > 0; END WHILE; RETURN oTemp; END1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
根据函数查询
根据子id递归查询所有父节点
根据子id查询父节点就不那么麻烦了,不需要写递归函数,当然,你也可以写递归函数来查询。我这边提供的是不写函数的方式。请看代码写sql语句
SELECT id,org_name,org_level,org_parent_id FROM ( SELECT @r AS _id, (SELECT @r := org_parent_id FROM vrv_org_tab WHERE id = _id) AS parent_id, @l := @l + 1 AS lvl FROM (SELECT @r := 10000, @l := 0) vars, vrv_org_tab h WHERE @r <> 0) T1 JOIN vrv_org_tab T2 ON T1._id = T2.id ORDER BY id;1
2
3
4
5
6
7
8
9
10
11
12
13
注意:大家看到那个10000了吗,就是我们的子节点id。
注意:只支持单个查询,意思是不可以根据两个或者两个以上的子节点同时查询出所有父节点。我们可以看到,上面参数都是单个值进行递归查询的。
西面提供一个函数支持多个查询
根据组织机构名称模糊查询所有父节点
该功能常用于组织机构模糊搜索创建函数
CREATE FUNCTION getParentOrgByOrgName(orgName VARCHAR(20)) RETURNS VARCHAR(4000) BEGIN DECLARE sPid VARCHAR(1000); DECLARE sPidTemp VARCHAR(1000); DECLARE pid VARCHAR(1000); DECLARE count INT DEFAULT 0; DECLARE allpid VARCHAR(4000); SET sPidTemp = ''; SELECT GROUP_CONCAT(DISTINCT(CAST(id AS CHAR))) INTO sPid FROM vrv_org_tab WHERE org_name LIKE CONCAT('%',orgName,'%'); SET allpid = ''; WHILE count = 0 DO IF sPid IS NULL THEN SET allpid = '-1'; SET count = 1; ELSE SET pid = SUBSTRING_INDEX(sPid,',',1); SET sPidTemp = CONCAT(sPidTemp,',',pid); IF LENGTH(pid) = LENGTH(sPid) THEN SET count = 1; SET sPid = SUBSTRING(sPid FROM LENGTH(SUBSTRING_INDEX(sPid,',',1)) FOR LENGTH(sPid)+1); ELSE SET sPid = SUBSTRING(sPid FROM LENGTH(SUBSTRING_INDEX(sPid,',',1))+2 FOR LENGTH(sPid)+1); END IF; SELECT GROUP_CONCAT(CAST(id AS CHAR)) INTO sPidTemp FROM ( SELECT @r AS _id, (SELECT @r := org_parent_id FROM vrv_org_tab WHERE id = _id) AS parent_id, @l := @l + 1 AS lvl FROM (SELECT @r := pid, @l := 0) vars, vrv_org_tab h WHERE @r <> 0) T1 JOIN vrv_org_tab T2 ON T1._id = T2.id; SET allpid = CONCAT_WS(',',pid,sPidTemp,allpid); END IF; END WHILE; RETURN allpid; END1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
根据函数查询
相关文章推荐
- 组织机构或家谱前端设计
- YbSoftwareFactory 代码生成插件【十一】:ASP.NET WebApi MVC下组织机构管理和菜单权限管理的实现
- jquery组织结构图插件 (基于jit-yc 做可拖动、自适应伸缩的orgchart)
- OrgChart组织架构图控件
- Eclipse 插件开发 基于org.eclipse.ui.startup扩展点 实现eclipse启动时执行相关操作
- 前端插件日常问题 整理
- Maven使用tomcat7-maven-plugin插件run时出现错误: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component
- 前端插件收集
- atitit 组织机构性质与名称表.docx
- Web前端学习--Sublime插件安装
- 【自制】简易轻量化前端树菜单插件(基于jquery制作)
- 分享一篇文章(前端插件)
- word和wps怎么在插入的“组织机构树”中增加
- JBPM的扩展-添加组织机构模型
- 前端JS---My97日期插件使用说明
- web前端的vim插件配置
- 第4章 组织机构(部门)管理
- 通用权限管理系统组件 (GPM - General Permissions Manager) 适合行政性单位使用的基于组织机构的权限管理系统
- 知问前端——验证插件(二)
- java 递归查询组织机构树