MySQL父子节点查询

摘要:
MySQL父子结点递归查询表结构:1CREATETABLE`agency`(2`id`varchar(32)NOTNULLCOMMENT'编号',3`name`varchar(30)NOTNULLCOMMENT'名称',4`addr`varchar(100)NOTNULLCOMMENT'位置',5`pId`varchar(32)DEFAULTNULLCOMMENT'父ID',6PRIMARYKEY

MySQL父子结点递归查询

表结构:

1 CREATE TABLE`agency` (
2   `id` varchar(32) NOT NULL COMMENT '编号',
3   `name` varchar(30) NOT NULL COMMENT '名称',
4   `addr` varchar(100) NOT NULL COMMENT '位置',
5   `pId` varchar(32) DEFAULT NULL COMMENT '父ID',
6   PRIMARY KEY(`id`)
7 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表数据:

MySQL父子节点查询第1张

查询子结点的所有父结点:

添加函数:findParent

1 CREATE FUNCTION `findParent`(`subId` varchar(32)) RETURNS varchar(4000)
2 BEGIN
3 DECLARE sTemp VARCHAR(1000);
4 DECLARE sTempPar VARCHAR(1000);
5 SET sTemp = '';
6 SET sTempPar =subId;
7 #循环递归
8 WHILE sTempPar is not nullDO
9 #判断是否是第一个,不加的话第一个会为空
10     IF sTemp != '' THEN
11         SET sTemp = concat(sTemp,',',sTempPar);
12     ELSE
13         SET sTemp =sTempPar;
14     END IF;
15     SET sTemp = concat(sTemp,',',sTempPar);
16     SELECT group_concat(pid) INTO sTempPar FROM agency where pid<>id and FIND_IN_SET(id,sTempPar)>0; 
17 END WHILE;
18 RETURNsTemp;
19 END

调用示例:

1select*from agency where FIND_IN_SET(id,findParent('6'))

显示结果:

MySQL父子节点查询第2张

查询根结点的所有子结点:

添加函数:findSubNode

1 CREATE FUNCTION `findSubNode`(`orgid` varchar(32)) RETURNS varchar(4000)
2 BEGIN
3 DECLARE oTemp VARCHAR(4000);
4 DECLARE oTempChild VARCHAR(4000);
5  SET oTemp = '';
6 SET oTempChild =orgid;
7  WHILE oTempChild IS NOT NULL
8 DO
9 SET oTemp = CONCAT(oTemp,',',oTempChild);
10 SELECT GROUP_CONCAT(id) INTO oTempChild FROM agency WHERE FIND_IN_SET(pId,oTempChild) > 0;
11 END WHILE;
12 RETURNoTemp;
13 END

调用示例:

1select*from agency where FIND_IN_SET(id,findSubNode('2'))

显示结果:

MySQL父子节点查询第3张

免责声明:文章转载自《MySQL父子节点查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nginx安装与配置(Nginx服务器和Tomcat服务器是不同的服务器)基于ack k8s集群调度的方案设计下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

es在win下添加数据(二)

win环境下把MySql中的数据导入到Elasticsearch(二) 环境问题参考我上文: https://blog.csdn.net/qq_24265945/article/details/81168158 环境问题已经好了,接下来,我们讲实战。 下载:mysql-connector-java-5.1.46.zip该压缩包帮助mysql与其他平台...

mysql 怎么通过sql语句批量去掉某一个表中某一个字段的多余字符

采用替换,把”<img src="http://t.zoukankan.com/“替换为空格," />也替换为空格,曾经在网上看到过这样的SQL,替换字段中字符串中的某些字符update 表名 set 要修改的字段名= replace(要修改的字段名,‘<img src="http://t.zoukankan.com/’,'')updat...

Mysql log_slave_updates 参数

官网说明: Normally, a slave does not log to its own binary log any updates that are received from a master server. This option tells the slave to log the updates performed by its SQL...

MySQL 8.0.11 GA版二进制安装

MySQL 8.0.11已发布,听闻性能提升两倍,今个自己安装体验下。1、卸载mysql老版本rpm -qa|grep mysql或者mairadbrpm -e mysql*/mariadb*rpm -e --nodeps mysql*/mariadb* 2、安装依赖包yum install gcc gcc-c++ libaio 3、下载软件包并解压tar...

go语言中操作mysql的方法

需要下载指定的golang的mysql驱动包 > go get github.com/go-sql-driver/mysql 下面的例子: package main; import ( "database/sql" _ "github.com/go-sql-driver/mysql" "fmt" ) func main() {...

MySQL定时删除按日分表或者按月分表的表

因为业务中有个库记录的日志类的数据,数据量巨大,程序做了一些表的按日分表或者按月分表。然后DBA通过脚本定时删除多少天之前或者几个月之前的表 按月分表的表每个月数据量300至500G  按天分表的表每天数据量20G  编写定时删除的脚本如下 #!/bin/bash date=`date -d -10day +%Y_%m_%d` user=root pas...