mysql递归层次查询

mysql递归层次查询

最近在做一个从oracle数据库到mysql数据库的移植,遇到一个这样的问题     
在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点。但shi,在MySQL的目前版本中还没有对应的函数!!! 
换句话来说,想要用mysql实现递归查询,根本做不到!!! 
可是经过我数天茶不思饭不想的刻苦琢磨,终于想到了一个合理的,适用于mysql和其他sql的解决方案。
www.2cto.com  
方案一出,就秋风扫落叶之势,席卷整个dao层~~~所到之处,所有问题迎刃而解,让所有问题都不再为问题 都成为了我这个函数的炮灰而已。。。 
话不多说待我把解决方法仔细道来~~~~~ 
下面是sql脚本,想要运行一下 把下边的粘贴复制下来,做一个treenodes.sq直接运行便是。。。 
/* 
Navicat MySQL Data Transfer 
Source Server         : mysql_demo3 
Source Server Version : 50521 
Source Host           : localhost:3306 
Source Database       : test 
Target Server Type    : MYSQL 
Target Server Version : 50521 
File Encoding         : 65001 
www.2cto.com  
Date: 2012-09-02 21:16:03 
*/ 
SET FOREIGN_KEY_CHECKS=0; 
-- ---------------------------- 
-- Table structure for `treenodes` 
-- ---------------------------- 
DROP TABLE IF EXISTS `treenodes`; 
CREATE TABLE `treenodes` ( 
`id` int(11) NOT NULL, 
`nodename` varchar(20) DEFAULT NULL, 
`pid` int(11) DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
-- ---------------------------- 
-- Records of treenodes 
-- ---------------------------- 
INSERT INTO `treenodes` VALUES ('1', 'A', '0'); 
INSERT INTO `treenodes` VALUES ('2', 'B', '1'); 
INSERT INTO `treenodes` VALUES ('3', 'C', '1'); 
INSERT INTO `treenodes` VALUES ('4', 'D', '2'); 
INSERT INTO `treenodes` VALUES ('5', 'E', '2'); 
INSERT INTO `treenodes` VALUES ('6', 'F', '3'); 
INSERT INTO `treenodes` VALUES ('7', 'G', '6'); 
INSERT INTO `treenodes` VALUES ('8', 'H', '0'); 
INSERT INTO `treenodes` VALUES ('9', 'I', '8'); 
INSERT INTO `treenodes` VALUES ('10', 'J', '8'); 
INSERT INTO `treenodes` VALUES ('11', 'K', '8'); 
INSERT INTO `treenodes` VALUES ('12', 'L', '9'); 
INSERT INTO `treenodes` VALUES ('13', 'M', '9'); 
INSERT INTO `treenodes` VALUES ('14', 'N', '12'); 
INSERT INTO `treenodes` VALUES ('15', 'O', '12'); 
INSERT INTO `treenodes` VALUES ('16', 'P', '15'); 
INSERT INTO `treenodes` VALUES ('17', 'Q', '15'); 
www.2cto.com  
--------------------------------------------------- 
上边是sql脚本,在执行select * 之后显示的结果集如下所示: 
mysql> select * from treenodes; 
+----+----------+------+ 
| id | nodename | pid  | 
+----+----------+------+ 
|  1 | A        |    0 | 
|  2 | B        |    1 | 
|  3 | C        |    1 | 
|  4 | D        |    2 | 
|  5 | E        |    2 | 
|  6 | F        |    3 | 
|  7 | G        |    6 | 
|  8 | H        |    0 | 
|  9 | I        |    8 | 
| 10 | J        |    8 | 
| 11 | K        |    8 | 
| 12 | L        |    9 | 
| 13 | M        |    9 | 
| 14 | N        |   12 | 
| 15 | O        |   12 | 
| 16 | P        |   15 | 
| 17 | Q        |   15 | 
+----+----------+------+ 
17 rows in set (0.00 sec) 
树形图如下 
1:A 
+-- 2:B 
|    +-- 4:D 
|    +-- 5:E 
+-- 3:C 
+-- 6:F 
+-- 7:G 
8:H 
+-- 9:I 
|    +-- 12:L 
|    |    +--14:N 
|    |    +--15:O 
|    |        +--16:P 
|    |        +--17:Q 
|    +-- 13:M 
+-- 10:J 
+-- 11:K   
-------------------------------------------- 
如果给你一个这样的table,让你查询根节点为1下的所有节点记录(注意也包括根节点),,肿麽办????? 
可能有不少人想到connect by 函数,但是我灰常遗憾的告诉你,咱这儿是mysql!!! 
好,客观您勒上眼,,我的解决办法是 
利用函数来得到所有子节点号。 
闲话少续,看我的解决方法 
创建一个function getChildLst, 得到一个由所有子节点号组成的字符串.  
mysql> delimiter // 
mysql> 
mysql> CREATE FUNCTION `getChildLst`(rootId INT) 
-> RETURNS varchar(1000) 
-> BEGIN 
->   DECLARE sTemp VARCHAR(1000); 
->   DECLARE sTempChd VARCHAR(1000); 
-> 
->   SET sTemp = '$'; 
->   SET sTempChd =cast(rootId as CHAR); 
-> 
->   WHILE sTempChd is not null DO 
->     SET sTemp = concat(sTemp,',',sTempChd); 
->     SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)>0; 
->   END WHILE; 
->   RETURN sTemp; 
-> END 
-> // 
Query OK, 0 rows affected (0.00 sec) 
mysql> 
mysql> delimiter ; 
www.2cto.com  
使用我们直接利用find_in_set函数配合这个getChildlst来查找 
mysql> select getChildLst(1); 
+-----------------+ 
| getChildLst(1)  | 
+-----------------+ 
| $,1,2,3,4,5,6,7 | 
+-----------------+ 
1 row in set (0.00 sec) 
mysql> select * from treeNodes 
-> where FIND_IN_SET(id, getChildLst(1)); 
+----+----------+------+ 
| id | nodename | pid  | 
+----+----------+------+ 
|  1 | A        |    0 | 
|  2 | B        |    1 | 
|  3 | C        |    1 | 
|  4 | D        |    2 | 
|  5 | E        |    2 | 
|  6 | F        |    3 | 
|  7 | G        |    6 | 
+----+----------+------+ 
7 rows in set (0.01 sec) 
mysql> select * from treeNodes 
-> where FIND_IN_SET(id, getChildLst(3)); 
+----+----------+------+ 
| id | nodename | pid  | 
+----+----------+------+ 
|  3 | C        |    1 | 
|  6 | F        |    3 | 
|  7 | G        |    6 | 
+----+----------+------+ 
3 rows in set (0.01 sec) 
-------------------------------------------- 
只要按我的做,百发百中弹无虚发,遇到问题万变不离其宗直接粘贴复制就是。。。 
补充:
还可以做嵌套查询: 
select id,pid from treeNodes where id in( 
select id from treeNodes where FIND_IN_SET(id, getChildLst(3)) 
); 
子查询的结果集是 
www.2cto.com  
+--------+ 
id 
---- 
+-------+ 
然后经过外层查询就是 
id  pid 
3   1 
6   3 
6   6 
--------- 
转自:http://www.2cto.com/database/201209/152513.html

转载于:https://www.cnblogs.com/yuan951/p/6429441.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows打开的winform当前焦点 是否是hwnd_推介几款 windows 下非常好用的工具

在下工具控一枚,平时会留意收集各种各样给我们生活生产带来便捷的工具,毕竟人生苦短;下面主要介绍一些我在 Windows 系统上发现的一些好用的工具,并且会一笔带过主要优点特点,具体详细用法可以搜一下,相关帖…

借力5G,云VR将推动VR产业迎“第二春”

来源:VR每日必看在近期举办的第八届全球物联网峰会上,作为中国电信5G商用产品的集约运营单位,号百控股在会展区域设置了天翼云VR产品专区,演示了韩国LG U独家授权内容,以及自制VR视频,引入关注。VR云化将实…

java强制删文件夹_java删除文件或文件夹的方法

java删除文件或文件夹的方法java里面删除文件夹时候,如果该文件夹下有内容,即其下包含的有文件或文件夹,当你执行java.io.File.delete(File file)方法时候,不能成功删除,那么如果我们想成功删除,该怎么办的…

python语言设计学习方向_学好Python开发就业方向有哪些?

原标题:学好Python开发就业方向有哪些?近年来,Python市场火爆,从业人员薪资不断增加,选择学Python的人也在逐年增多。然而,很多人学Python只是盲目的跟随潮流,对于Python却不甚了解,…

Linq的优点以及注意事项

转载于:https://www.cnblogs.com/hubbert123/p/6429926.html

低调!中国北斗核心卫星部署完成,开启“全球时代”!超越GPS指日可待

来源:科技杂谈、百度物联网智库 整理发布导 读2019年12月16日15时22分,我国在西昌卫星发射中心用长征三号乙运载火箭(及配套远征一号上面级),以“一箭双星”的方式成功将第52、53颗北斗导航卫星发射升空。至此&#x…

mysql 读取文件_关于mysql:逐行读取文件而不将整个文件加载到内存中

我正在使用50 Gb MySQL导出文件,并对其执行脚本操作列表以转换为SQLite3可加载形式(我从这里得到的线索:脚本将mysql dump sql文件转换为可以导入sqlite3的格式D b )。我尚未研究MySQL转储的结构,数据是从第三方获得的。我可以看到它具有创建…

python深浅拷贝 面试_Python面试宝典之基础篇-02

原标题:Python面试宝典之基础篇-02我觉得你如果正在找工作,我的Python面试宝典几期教程,你一定得花时间看完了!题目006:说说Python中的浅拷贝和深拷贝。点评:这个题目本身出现的频率非常高,但是…

磁盘挂载基本概念

基本概念PV( 全称 Physical Volume , 物理卷):普通的直接坊问的存储设备,有固定的和可移动的之分,代表性的就是硬盘 VG(全称 Volume Group,卷组):AIX中最大的存储单元,一个卷组由一个或多个PV组成 PP(全称 Physical Partition,物理分区):将PV…

数字孪生白皮书(2019)

▲ 赛迪工业互联网首席研究员袁晓庆博士发布报告来源:赛迪智库以下是白皮书主要内容的PPT:(点击放大观看)123456789101112131415161718192021222324252627282930未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&…

java手动线程池使用_Java手动配置线程池过程详解

线程池中,常见有涉及到的:ExecutorService executorService Executors.newSingleThreadExecutor();ExecutorService executorService1 Executors.newCachedThreadPool();ExecutorService executorService2 Executors.newFixedThreadPool(3);关于Execu…

BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[i]$表示第$i$天最多能得到的钱…

集水井盖板图集07fj02_【干货】住宅通病详细图集(图文详解)

工序节点1建筑物外墙与散水坡、台阶、明沟留沉降缝图示:要求与做法:1、散水坡、台阶、明沟本身按≤6m长度(总长度均分)留沉降缝。2、外墙阴阳角位按450角留沉降缝。3、散水坡与台阶交接处留沉降缝分隔。工序节点2室外地面 伸缩缝图示:要求与…

最新发布!北京市机器人产业创新发展行动方案(2019-2022) “5432”推动北京机器人产业高质量发展...

来源:机器人大讲堂各有关单位:为贯彻《北京市加快科技创新发展智能装备产业的指导意见》,推动北京市机器人产业高质量发展,现将《北京市机器人产业创新发展行动方案(2019—2022年)》印发给你们,…

php png 输出,PHP直接输出一张图片代码写法

示例代码:public function img(){$img "https://file.zyku.net/p/b197f42c06ffff2e03bfbacee4ce94c4.jpg";$info getimagesize($img);$imgExt image_type_to_extension($info[2], false); //获取文件后缀$fun "imagecreatefrom{$imgExt}";$…

判别分析分为r型和q型吗_电流互感器天天见,但是你真正了解和知道它的一些注意事项吗?...

电流互感器也许你天天见,但是你真正了解电流互感器和它的一些注意事项吗?今天我就带大家一步步分析下电流互感器。一,定义,什么是电流互感器?电流互感器是根据电磁感应原理将一次侧大电流转换成二次侧小电流来测量或计…

LintCode 373: Partition Array

LintCode 373: Partition Array 题目描述 分割一个整数数组,使得奇数在前偶数在后。 样例 给定[1, 2, 3, 4],返回[1, 3, 2, 4]。 Thu Feb 23 2017 思路 简单题,可以很自然地想到再用一个答案数组,从头到尾遍历一遍,遇到…

刚刚,Science发布2019十大科学突破!

来源:中国生物技术网 北京时间12月20日,《Science》公布了今年的十大突破。“直视”黑洞图片来源:UNIVERSITY OF ARIZONA/INSTITUTE FOR ADVANCED STUDY图片来源:EHT COLLABORATION/CC 4.0巨大的、无处不在的黑洞,在某…

nginx php分离,nginx-php配置动静分离

实验目的:nginx-php配置动静分离实验环境:主机 192.168.88.100 NGINX服务器主机 192.168.88.102 PHP和MYSQL服务器注意:想要手工编译必须安装gcc gcc-c make 这三个插件并且关闭防火墙service firewalld stopsystemctl disable firewalld1.在…

用python分析小说_用Python对哈利波特系列小说进行情感分析

原标题:用Python对哈利波特系列小说进行情感分析准备数据现有的数据是一部小说放在一个txt里,我们想按照章节(列表中第一个就是章节1的内容,列表中第二个是章节2的内容)进行分析,这就需要用到正则表达式整理数据。比如我们先看看 …