通过父级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] Django框架入门4——深入模板
说明: 本文主要深入了解模板(templates),主要涉及模板编写步骤.定义模板.模板继承.HTML转义.CSRF等. 一.模板 动态生成HTML.表达外观.实现业务逻辑(view)与显示内容(te ...
- MSIL实用指南-加载int值
这一篇讲的是怎样加载整数值到运算栈上.这一类的指令都是以Ldc_I4开头. Ldc_I4类OpCodes的Ldc_I4字段的功能是把一个int值压入运算栈上.它的使用方法是ilGenerator.Em ...
- ES6之解构
1.ES6允许按照一定的模式,从数组中和对象中提取值,对变量进行赋值,这种称为解构(Distructuring): let [a,b,c] = [3,5,6];// 相当于 a=3,b=5,c=6 本 ...
- PHP学习—了解篇
了解PHP 了解神器:PhpStudy 一键搭建PHP环境 语法: PHP是一种可以嵌套在HTML页面的脚本语言 嵌套HTML文件: <!DOCTYPE html> <html& ...
- .NET敏感信息分离托管 娓娓道来
引言 互联网每隔一段时间就会爆出 [某程序猿在代码托管平台上传了公司机密配置信息,导致公司核心数据被黑客获取或修改], 一茬又一茬背锅侠层出不穷. 软件工程理论早以加粗字体给出 经典原则:Never ...
- HDU 5793 A Boring Question 多校训练
There are an equation. ∑0≤k1,k2,⋯km≤n∏1⩽j<m(kj+1kj)%1000000007=?∑0≤k1,k2,⋯km≤n∏1⩽j<m(kj+1kj)%1 ...
- 淘淘购物系统 (Python)
#首页def tao_first(): t1 = '欢迎进入淘淘购物'.center(110) print(t1) print('~' * 130) t2 = '注册'.center(20) prin ...
- yzoj2057 x 题解
题意:给出一个集合,要求把这个集合分成两部分,使得一个集合中的任一元素都与另一个集合的全部元素都两两互质 暴力 枚举每个元素O(n^2)再暴力判gcd=1,如果非1就放入不同集合内,用并查集维护联通块 ...
- 【Windows】PostgreSql安装
Installer安装包问题 Problem running post-install step. Installation may not complete correctly. The datab ...
- 3.python之文件操作
一.文件操作初识 f = open('文件路径', '编码方式', '操作方式') # 注意里面所有内容,需加引号 ” 打开一个文件需要知道的内容有: 文件路径:c:\文件.txt(绝对路径和相对路径 ...