Mysql递归查询(通过自定义函数,实现父子类关系查询)
父子类树tree的关系,比如部门层次结构,菜单结构,可能我们更改了一级的数据,下面的所有子类以及子孙类都需要更改,
可以自定义mysql函数,进行查询出先关联数据,递归查询:
创建测试表:
CREATE TABLE `test1` (
`id` int(32) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`age` int(10) DEFAULT NULL,
`parent_id` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
加入sql语句:
INSERT INTO `mytest`.`test1` (`id`, `name`, `age`, `parent_id`) VALUES ('1', '张三', '23', NULL);
INSERT INTO `mytest`.`test1` (`id`, `name`, `age`, `parent_id`) VALUES ('2', '李四', '24', '1');
INSERT INTO `mytest`.`test1` (`id`, `name`, `age`, `parent_id`) VALUES ('3', '王五', '25', '2');
INSERT INTO `mytest`.`test1` (`id`, `name`, `age`, `parent_id`) VALUES ('4', '赵六', '26', '3');
INSERT INTO `mytest`.`test1` (`id`, `name`, `age`, `parent_id`) VALUES ('5', '钱七', '27', '4');
INSERT INTO `mytest`.`test1` (`id`, `name`, `age`, `parent_id`) VALUES ('6', '王八', '28', '5');
准备工作完成:
使用mysql创建、调用存储过程,函数以及触发器的时候会有错误符号为1418错误!
设置log_bin_trust_routine_creators全局系统变量为1。我是在客户端上执行SET GLOBAL log_bin_trust_function_creators = 1;
当然还有其他解决办法eg:函数加DETERMINISTIC字段等,我这就不提了,可百度mysql报1418错误即可
1:向下递归:
DROP FUNCTION IF EXISTS queryChildrenIsDown;
CREATE FUNCTION queryChildrenIsDown(paramId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);
SET sTemp='$';
SET sTempChd = CAST(paramId AS CHAR);
WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(id) INTO sTempChd FROM test1 WHERE FIND_IN_SET(parent_id,sTempChd)>0;
END WHILE;
RETURN sTemp;
END
2:向上递归
DROP FUNCTION IF EXISTS queryChildrenByUp;
CREATE FUNCTION queryChildrenByUp(paramId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);
SET sTemp='$';
SET sTempChd = CAST(paramId AS CHAR);
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT parent_id INTO sTempChd FROM test1 WHERE id = sTempChd;
WHILE sTempChd <> 0 DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT parent_id INTO sTempChd FROM test1 WHERE id = sTempChd;
END WHILE;
RETURN sTemp;
END
除此之外,也可以写些其他的查询函数:
eg:
BEGIN
RETURN(SELECT CONCAT('employee name:',name,'---','id: ',id) FROM test1 WHERE parent_id=id);
END
Mysql递归查询(通过自定义函数,实现父子类关系查询)相关推荐
- mysql存储过程和自定义函数
2019独角兽企业重金招聘Python工程师标准>>> 存储过程简介 SQL语句需要先编辑后执行,而存储过程是一组为了完成特定功能的SQL语句集,经编译后存储过程在数据库中,用户通过 ...
- mysql存储过程与自定义函数
2019独角兽企业重金招聘Python工程师标准>>> #mysql存储过程与自定义函数: delimiter $ 1.最简单的存储过程 create procedure test( ...
- MySQL学习笔记—自定义函数
MySQL学习笔记-自定义函数 注释语法: MySQL服务器支持3种注释风格: 从'#'字符从行尾. 从'– '序列到行尾.请注意'– '(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如 ...
- oracle迁移mysql视图中函数问题,mysql中to_char自定义函数。
迁移到mysql中会遇到函数迁移问题,我们可以自定义函数 DELIMITER $$ CREATE FUNCTION new_data_report.to_char(Intnumber int) RET ...
- mysql 8.0 自定义函数_PHP+Mysql防止SQL注入的方法(life)
这篇文章介绍的内容是关于PHP+Mysql防止SQL注入的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 我的官方群点击此处. 方法一: mysql_real_escape_str ...
- mysql 如何创建自定义函数
mysql创建一个函数 delimiter $$ create function 函数名字() returns 返回值类型 begin 函数体- return 返回值(注意类型必须和上面的一样) en ...
- mysql存储过程和自定义函数_MySQL存储过程/存储过程与自定义函数的区别
语法: 创建存储过程: CREATE[definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_paramet ...
- mysql工作日_mysql自定义函数计算时间段内的工作日(支持跨年)
① 同一年的情况下计算工作日函数 CREATE DEFINER=`root`@`%` FUNCTION `WORKDAYSONEYEAR`(`datefrom` datetime,`dateto` d ...
- mysql 经纬度距离 自定义函数_mysql 经纬度计算距离 自定义函数
这些经纬线是怎样定出来的呢? 地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈就叫作&quo ...
最新文章
- 程序员春节必备金句,简直不能再机智!
- 构建高可靠hadoop集群之0-hadoop用户向导
- JVM04内存结构概述
- helloworld:一个完整的WCF案例
- 二级计算机vf题型,计算机二级VF题型有哪些?
- 汽车CAN总线-基础
- bing 搜索引擎 无法访问 bug
- FastDFS文件服务器升级内置nginx版本
- 360漏洞修复的提取
- 企业数据防泄漏解决方案分享
- 河南工学院计算机宿舍,河南工学院宿舍条件,宿舍几人间环境好不好(图片)
- Excel下拉菜单如何制作?
- RAD Studio 11.X Alexandria release有何新的改变及改变实务
- 惊闻女程序员公开举报:摩拜单车前端组 leader 性骚扰下属!
- LIB,DLL区别 及 QT中如何添加LIB,DLL
- python按按钮变颜色_当按钮单击时更改按钮颜色
- 选择vray Next for SketchUp创建具启发性的、逼真的渲染的8大理由!
- 电子签名能用到哪些格式上
- 员工试用期转正申请书(潍柴重庆汽车)
- 企业如何在组织架构改变时,来实现员工的人岗匹配