MySQL通过自定义函数实现递归查询父级ID或者子级ID
作者:枫叶思源 发布时间:2024-01-19 03:30:07
标签:mysql,递归查询,自定义函数
背 景:
在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度, 那么所有节点为根的树的深度均不会超过树的最大深度,则我们可以直接通过left join来实现。
但很多时候我们是无法控制或者是知道树的深度的。这时就需要在MySQL中用存储过程(函数)来实现或者在程序中使用递归来实现。本文讨论在MySQL中使用函数来实现的方法:
一、环境准备
1、建表
CREATE TABLE `table_name` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` int(255) NULL DEFAULT NULL,
`pid` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
2、插入数据
INSERT INTO `table_name` VALUES (1, 12, 0);
INSERT INTO `table_name` VALUES (2, 4, 1);
INSERT INTO `table_name` VALUES (3, 8, 2);
INSERT INTO `table_name` VALUES (4, 16, 3);
INSERT INTO `table_name` VALUES (5, 32, 3);
INSERT INTO `table_name` VALUES (6, 64, 3);
INSERT INTO `table_name` VALUES (7, 128, 6);
INSERT INTO `table_name` VALUES (8, 256, 7);
INSERT INTO `table_name` VALUES (9, 512, 8);
INSERT INTO `table_name` VALUES (10, 1024, 9);
INSERT INTO `table_name` VALUES (11, 2048, 10);
二、MySQL函数的编写
1、查询当前节点的所有父级节点
delimiter //
CREATE FUNCTION `getParentList`(root_id BIGINT)
RETURNS VARCHAR(1000)
BEGIN
DECLARE k INT DEFAULT 0;
DECLARE fid INT DEFAULT 1;
DECLARE str VARCHAR(1000) DEFAULT '$';
WHILE rootId > 0 DO
SET fid=(SELECT pid FROM table_name WHERE root_id=id);
IF fid > 0 THEN
SET str = concat(str,',',fid);
SET root_id = fid;
ELSE
SET root_id=fid;
END IF;
END WHILE;
RETURN str;
END //
delimiter ;
2、查询当前节点的所有子节点
delimiter //
CREATE FUNCTION `getChildList`(root_id BIGINT)
RETURNS VARCHAR(1000)
BEGIN
DECLARE str VARCHAR(1000) ;
DECLARE cid VARCHAR(1000) ;
DECLARE k INT DEFAULT 0;
SET str = '$';
SET cid = CAST(root_id AS CHAR);12 WHILE cid IS NOT NULL DO
IF k > 0 THEN
SET str = CONCAT(str,',',cid);
END IF;
SELECT GROUP_CONCAT(id) INTO cid FROM table_name WHERE FIND_IN_SET(pid,cid)>0;
SET k = k + 1;
END WHILE;
RETURN str;
END //
delimiter ;
三、测试
1、获取当前节点的所有父级
SELECT getParentList(10);
2、获取当前节点的所有字节
SELECT getChildList(3);
总结
以上所述是小编给大家介绍的MySQL通过自定义函数实现递归查询父级ID或者子级ID网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://www.cnblogs.com/cmacro/archive/2019/11/26/11937341.html


猜你喜欢
- iterrows(),iteritems(),itertuples()区别Python函数之iterrows, iteritems, ite
- 引用PyMongo>>> import pymongo创建连接Connection>>> import
- 本文通过Python3+pyqt5实现了python Qt GUI 快速编程的19章的页面索引器应用程序例子。/home/yrd/eric_
- python的matplotlib包支持我们画图,有点非常多,现学习如下。首先要导入包,在以后的示例中默认已经导入这两个包import ma
- 概述何为路由守卫?路由守卫有点类似于ajax的请求 * ,就是请求发送之前先给你拦截住做一些事情之后再去发送请求,同样这里的路由守卫意思差不
- 目录1、前言2、递归3、回调函数3.1匿名回调函数3.2带参数的回调函数3.3回调函数的优缺点4、自调函数5、为值的函数6、闭包1、前言在J
- 1 参数选择 径向畸变3个参数还是两个参数默认两个参数如果是三个参数2准备转化生成结果二参数的转化代码writeExternalandInt
- pycharm三个有引号不能自动生成函数注释函数注释自动生成函数注释,包括参数和返回值。使用方法,函数定义时,直接输入三个双引号后回车,例如
- pydbclib是一个通用的python关系型数据库操作工具包,使用统一的接口操作各种关系型数据库(如 oracle、mysql、postg
- 上节基本完成了SVM的理论推倒,寻找最大化间隔的目标最终转换成求解拉格朗日乘子变量alpha的求解问题,求出了alpha即可求解出SVM的权
- 在js方法中添加"path= 过期时间"就可以解决这个问题。 例如://写cookies function setCoo
- 一、动机(Motivate)在我们的现实生活中有很多例子可以拿来说明这个模式,我们还拿吃饺子这个事情来说。我的奶奶说了,今天想吃饺子,发出了
- MD5(Message-Digest Algorithm 5) 模块用于计算信息密文(信息摘要),得出一个128位的密文。sha模块跟md5
- ewebeditor支持兼容IE8 的方法方法:前几天ie8正式公布了,当天中午我就去下载了一个迫不急待的将自己的浏览器升级到ie8,偶还刻
- 报错信息粉丝群里面一个小伙伴想用pip安装库的时候出现的提示报错(当时他心里瞬间凉了一大截,跑来找我求助,然后顺利帮助他解决了,顺便记录一下
- 本文主要分享的是一则python+opencv实现任意角度的透视变换的实例,具体如下:# -*- coding:utf-8 -*-impor
- <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
- 网络I/O模型人多了,就会有问题。web刚出现的时候,光顾的人很少。近年来网络应用规模逐渐扩大,应用的架构也需要随之改变。C10k的问题,让
- 一、绘制线性图形执行如下代码import matplotlib.pyplot as pltdataX=[1,2,3,4]dataY=[2,4
- 本文实例讲述了jQuery实现弹出带遮罩层的居中浮动窗口效果。分享给大家供大家参考,具体如下:<!doctype html>&l