Mysql中的递归层次查询(根据父节点查找所有的子节点和根据子节点查询所有的父节点)的两种运用
来源:互联网 发布:知乎python入门 编辑:程序博客网 时间:2024/04/30 06:12
1、根据子节点查询所有的父节点
创建getParentList函数
SQL语句如下:
delimiter //CREATEFUNCTION `getParentList`(rootId INT)RETURNS varchar(1000)BEGINDECLARE sTempVARCHAR(1000);DECLARE sTempParVARCHAR(1000);SET sTemp ='';SET sTempPar =rootId;#循环递归WHILE sTempPar is not null DO#判断是否是第一个,不加的话第一个会为空IF sTemp !='' THENSET sTemp =concat(sTemp,',',sTempPar);ELSESET sTemp = sTempPar;ENDIF;SET sTemp =concat(sTemp,',',sTempPar);SELECTgroup_concat(pid) INTO sTempPar FROM province where pid<>idand FIND_IN_SET(id,sTempPar)>0;ENDWHILE;RETURN sTemp;END//
此时Mysql可能会报如下错误:
解决方法:
执行此语句:show VARIABLES like "log_bin_trust_function_creators";
发现log_bin_trust_function_creators的值为OFF(这是默认值)
那么,我们再执行语句:set global log_bin_trust_function_creators = 1;
现在再来查看log_bin_trust_function_creators的值已经变为ON了
最后,函数就可以创建成功了。
新建一张数据表province
执行以下sql语句:
SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for province-- ----------------------------DROP TABLE IF EXISTS `province`;CREATE TABLE `province` ( `id` int(10) NOT NULL, `name` varchar(10) NOT NULL, `pid` int(10) unsigned NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of province-- ----------------------------INSERT INTO `province` VALUES ('1', '福建', '0');INSERT INTO `province` VALUES ('2', '湖南', '0');INSERT INTO `province` VALUES ('3', '湖北', '0');INSERT INTO `province` VALUES ('4', '长沙', '2');INSERT INTO `province` VALUES ('5', '郴州', '2');INSERT INTO `province` VALUES ('6', '武汉', '3');INSERT INTO `province` VALUES ('7', '武昌', '3');INSERT INTO `province` VALUES ('8', '厦门', '1');INSERT INTO `province` VALUES ('9', '福州', '1');INSERT INTO `province` VALUES ('10', '泉州', '1');INSERT INTO `province` VALUES ('11', '闽侯', '9');INSERT INTO `province` VALUES ('12', '长乐', '9');INSERT INTO `province` VALUES ('13', '安溪', '10');INSERT INTO `province` VALUES ('14', '晋江', '10');INSERT INTO `province` VALUES ('15', '凤城', '13');INSERT INTO `province` VALUES ('16', '参内', '13');INSERT INTO `province` VALUES ('17', '龙湖', '15');
创建成功,如图:
执行查询语句:select * from province where FIND_IN_SET(id,getParentList(17))
查询结果:
2、根据父节点查找所有的子节点
创建函数getChildrenList
SQL语句如下:
delimiter //CREATE FUNCTION `getChildrenList`(rootId INT)RETURNS varchar(1000)BEGINDECLARE sTemp VARCHAR(1000);DECLARE sTempChd VARCHAR(1000);SET sTemp = '$';SET sTempChd =cast(rootId as CHAR);WHILE sTempChd is not null DOSET sTemp = concat(sTemp,',',sTempChd);SELECT group_concat(id) INTO sTempChd FROM province where FIND_IN_SET(pid,sTempChd)>0;END WHILE;RETURN sTemp;END//
执行查询语句:select * from province where FIND_IN_SET(id,getChildrenList(1))
查询结果如下:
阅读全文
0 0
- Mysql中的递归层次查询(根据父节点查找所有的子节点和根据子节点查询所有的父节点)的两种运用
- SQL 递归查询(根据指定的节点向上获取所有父节点,向下获取所有子节点)
- MySQL中根据父节点查询其所有子节点
- mysql 根据id查询所有子节点/父节点
- SQL - 根据父节点查询所有子节点
- MySQL中进行树状所有子节点的查询 . mysql根据父id 查询所有的子id
- T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
- T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
- T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
- T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
- T-Sql 递归查询(给定节点查所有父节点、所有子节点的方法)
- MySQL 递归查询树状表的所有子节点、所有父节点具体实现
- ztree递归查询某节点下的所有子节点
- Extjs4中tree组件查找所有父节点和查找所有子节点的递归方法
- sqlserver 根据子节点查找所有父节点
- MySQL递归查询树状表的子节点、父节点
- MySQL递归查询树状表的子节点、父节点
- MySQL递归查询树状表的子节点、父节点
- 3月英语总结
- 我们的《作品展》
- 神奇的记忆力
- [python每日一练]--0001:生成激活码
- ACHI
- Mysql中的递归层次查询(根据父节点查找所有的子节点和根据子节点查询所有的父节点)的两种运用
- Docker容器数据管理6
- Flash与VB交互
- 三合班课堂总结
- Runtime 学习-方法交换
- 站在巨人的肩膀上——英语
- Java 使用iText7生成带页码的PDF文件(同时生成目录,但是不会合并两个PDF)
- VB总结.3
- 冒泡排序法