通过父级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 ...
随机推荐
- js的真值与假值
假值 结果为 false 的值称为 假值.例如,空字符串 "" 为假值,因为在布尔表达式中,"" 等于 false. false == 0返回:true fal ...
- GIS基础知识 - 坐标系、投影、EPSG:4326、EPSG:3857
最近接手一个GIS项目,需要用到 PostGIS,GeoServer,OpenLayers 等工具组件,遇到一堆地理信息相关的术语名词,在这里做一个总结. 1. 大地测量学 (Geodesy) 大地测 ...
- 【qt】【QString的诸多操作】
前言: qt的数据处理莫过于QString,QString对于字符串的操作多的数不胜数.下面博主就将常用的罗列出来,一起分享. 正文: 下面的操作具体为:追加,查找,删除,提取,分割,各种转换等等. ...
- office web apps server安装
1.准备服务器 准备一台windows server 2012 R2服务器,修改计算机名称加入域,如果是通过虚拟机复制导致sid冲突,可以先运行 c:\windows\system32\sysprep ...
- Badboy中创建Suite, test, step和Template
参考: http://leafwf.blog.51cto.com/872759/1111744 http://www.51testing.com/html/00/130600-1367743.html ...
- 五月月赛 寻宝 exkmp + 主席树
: 寻宝 时间限制: Sec 内存限制: MB 提交: 解决: [提交] [状态] [讨论版] [命题人:admin] 题目描述 采蘑菇的小西佬找到了一张上古年间的藏宝图,上面画着m座连绵不断的山,他 ...
- lightoj 1111 - Best Picnic Ever(dfs or bfs)
题目链接 http://www.lightoj.com/volume_showproblem.php?problem=1111 题意:给你一个有向图再给你几个人的位置,问所有人可以在哪些点相聚. 简单 ...
- CF985B Switches and Lamps 思维 第十九
Switches and Lamps time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- R:ggplot2数据可视化——基础知识
1 安装 # 获取ggplot2 最容易的就是下载整个tidyverse: install.packages("tidyverse") # 也可以选择只下载ggplot2: ins ...
- 解决rac错误 ORA-01102: cannot mount database in EXCLUSIVE mode
启动 Oracle 11g RAC数据库时出现以下错误.只能启动其中一个节点(rac01),另一个节点启动不了(rac02).可能是以前修改cluster_database这个参数引起的.在Orac ...