通过父级id获取到其下所有子级(无穷级)——Mysql函数实现
【需求】某用户只能查看其自己信息及其下级信息,涉及通过该用户所在部门获取其下所有部门(多层)id集合。
步骤一:对数据库进行设置:
set global log_bin_trust_function_creators=TRUE;
可以在Navicate点击工具栏的【工具】-> 【命令行界面】执行以上语句;也可以在服务器上进入数据库执行。
步骤二:执行以下sql语句,生成sql方法。
(1)需求一,获取父级及子级id:
CREATE FUNCTION `getChildList`(`rootId` VARCHAR()) RETURNS varchar() CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR();
DECLARE sTempChd VARCHAR();
DECLARE count INT DEFAULT ; SET sTemp = '';-- 返回值
SET sTempChd =cast(rootId as CHAR); -- 父id -- 判断父id是否存在
SET count=(SELECT count() from sys_dept WHERE Id=rootId);
IF count> THEN
-- 遍历拼接所有子节点id
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(Id) INTO sTempChd FROM sys_dept where FIND_IN_SET(Parent_Id,sTempChd)>;
END WHILE;
-- 剔除拼接后多余的第一个逗号
SET sTemp = (SELECT TRIM(LEADING ',' FROM sTemp));
END IF;
RETURN sTemp;
END
(2)需求二,仅获取所有子级id:
CREATE FUNCTION `getChildList`(`rootId` VARCHAR()) RETURNS varchar() CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR();
DECLARE sTempChd VARCHAR();
DECLARE count INT DEFAULT ; SET sTemp = '';-- 返回值
SET sTempChd =cast(rootId as CHAR); -- 父id -- 判断父id是否存在
SET count=(SELECT count() from sys_dept WHERE Id=rootId);
IF count> THEN
-- 遍历拼接所有子节点id
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(Id) INTO sTempChd FROM sys_dept where FIND_IN_SET(Parent_Id,sTempChd)>;
END WHILE;
-- 剔除拼接后父级id及第一个多余的逗号
SET sTemp = (select substring(sTemp, LENGTH(SUBSTRING_INDEX(sTemp,",",))+));
END IF;
RETURN sTemp;
END
测试:

解释:为什么需要步骤一的配置?
如果不配置的话,该函数在生成的时候会报错。
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
报错原因:
这是我们开启了bin-log, 我们就必须指定我们的函数是否是
1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句
其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。
通过父级id获取到其下所有子级(无穷级)——Mysql函数实现的更多相关文章
- 根据子级ID获取其所有父级
		当前位置>新闻中心>行业资讯 CLASSID CLASSNAME CLASSPID 1 新闻中心 0 2 行业资讯 1 3 公司新闻 1 4 媒体聚焦 0 当前位置<%=navNam ... 
- SQL根据指定节点ID获取所有父级节点和子级节点
		--根据指定节点ID获取所有子节点-- WITH TEMP AS ( SELECT * FROM table_name WHERE Id=' --表的主键ID UNION ALL SELECT T0. ... 
- SQL根据指定节点ID获取所有父级节点和子级节点(转载)
		--根据指定节点ID获取所有子节点-- WITH TEMP AS ( ' --表的主键ID UNION ALL SELECT T0.* FROM TEMP,table_name T0 WHERE TE ... 
- 递归方式---通过子级id,获取子级和父级Name
		#region 递归--返回 父级|子级 名称 #region --返回 父级|子级 名称 public string RetrurnTypeNames(string TypeId) { String ... 
- Element ui tree树形控件获取父节点id
		Element-ui官网给的方法 getCheckedKeys() { console.log(this.$refs.tree.getCheckedKeys()); }, 这种只有在所有子级都被选中的 ... 
- MySQL通过自定义函数实现递归查询父级ID或者子级ID
		背 景: 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度, 那么所有节点为根的树的深度均不会超过树的最大深度,则我们可以直接通过left join来实现. 但很多时候我们是无 ... 
- vue_elementUI_ tree树形控件 获取选中的父节点ID
		el-tree 的 this.$refs.tree.getCheckedKeys() 只可以获取选中的id 无法获取选中的父节点ID想要获取选中父节点的id;需要如下操作1. 找到工程下的node_m ... 
- 获取进程ID,父进程ID,进程完整路径
		准备写一个进程管理的功能模块,今天下午先写了扫描获取本机各个进程路径,获取各个进程映像名称,进程完整路径. 要获取进程信息,第一步想到的就是提权,提权代码用过多次了,今天也小结了一下(http://w ... 
- Element ui tree树形控件获取当前节点id和父节点id
		低版本Element ui tree树形控件获取当前节点id和父节点id的方法:点击查看 最新版本Element ui tree树形控件获取当前节点id和父节点id教程: 1.找到node_modul ... 
随机推荐
- Python Web Flask源码解读(二)——路由原理
			关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ... 
- C#开发BIMFACE系列7 服务端API之获取文件信息列表
			系列目录 [已更新最新开发文章,点击查看详细] 本文详细介绍如何获取BIMFACE平台中所有上传过的文件信息列表. 请求地址:GET https://file.bimface.com/file ... 
- ScrollView中页面显示自动滑到最后问题的解决
			转载:https://blog.csdn.net/a644904088/article/details/80241176 原因:ScrollView中包含其余控件,但控件显示不全,此时会存在焦点问题, ... 
- codeforces 733D	Kostya the Sculptor(贪心)
			Kostya is a genial sculptor, he has an idea: to carve a marble sculpture in the shape of a sphere. K ... 
- poj3984 迷宫问题(简单的输出路径的bfs)
			题目链接 http://poj.org/problem?id=3984 中文题题意不解释了 反正就是简单的结构体套结构体存一下路径就行了 #include <iostream> #incl ... 
- CodeForces 980 C  Posterized
			Posterized 题意:将[0,255] 分成 若干段, 每一段的长度最多为k, 每一个数只能被放进一个段里, 然后每一段的数组都可以被这一段最小的数字表示, 求最小的字典序. 题解:每次一个访问 ... 
- 一个简单的hibernate自动创建表
			导入关键jar 举炉石传说卡片说明,Card.java Card.hbm.xml Card.java Card.hbm.xml <?xml version="1.0"?& ... 
- ==   !=    ===   equals() 区别
			java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型. byte,short,char,int,long,float,double,boolean,他们之间的比较,应用双等号(==) ... 
- zookeeper集群部署问题排查记录
			今天在三台虚拟机搭建zookeeper集群,一直连不通,然后进行了几个小时的斗争,做个记录. 具体部署方式网上有很多, 不在赘述.产生连接不同的问题主要有以下几个方面: 1.仔细检查配置文件. 是否有 ... 
- git bash 界面修改成linux界面
			在使用git bash操作git时,$符总是另起一行,给人感觉特别不爽,特别想修改成linux下一样的风格. 在git输入命令: vim ~/.bash_profile 进入insert模式,添加内容 ... 
