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

----

3

6

7

+-------+

然后经过外层查询就是

id  pid

3   1

6   3

6   6

--------- 
转自:http://www.2cto.com/database/201209/152513.html

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

mysql递归层次查询相关推荐

  1. oracle 递归层次查询

    工作需要,要查询一个节点的所有子节点信息,在网上找了很久,没有看到直接的例子的,很多理论,所以给个例子,作为我这种小白水平的人看看: 举例子: create table SCAN_MERC_INFO ...

  2. Mysql中的递归层次查询(父子查询)

    最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询? 在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是, ...

  3. Mysql中的递归层次查询(父子查询,无限极查询)

    前言:最近面试的时候遇到公司要求只能用SQL来查询无限极的数据,不能用PHP程序做递归查询,现在分享方法. 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即 ...

  4. mysql递归死循环查询_MySQL 递归查询实践总结

    MySQL复杂查询使用实例 By:授客QQ:1033553122 表结构设计 SELECT id, `name`, parent_id FROM `tb_testcase_suite` 说明: par ...

  5. mysql的递归查询_比较两种mysql递归tree查询效率-mysql递归tree

    --初始数据 INSERT INTO `t_areainfo` VALUES ('1', '0', '中国', '0', '0'); INSERT INTO `t_areainfo` VALUES ( ...

  6. mysql递归查询之后的排序问题_MySQL递归排序查询+树节点生成

    mysql 递归排序查询 备注:producttype 排序表,producttype.ptype父节点 ,producttype .id 主键,showTreeNodes (IN rooti mys ...

  7. 机构层级列表递归展示查询,并优化SQL查询

    文章目录 问题背景 原始方案 ①按照层级进行递归查询 ② 定义递归体进行递归查询 ③ 查询结果(部分省略截图) ④原始方案总结 优化需求 优化方案 ①查询出所有机构信息作为数据源,后面使用代码手动处理 ...

  8. mysql用户变量递归_MYSQL递归树查询的实现

    ​    在oracle中我们可以使用connect by prior 函数来实现组织树表递归的查询,但是在mysql中却没有该方法,为了能够使用该方法我们就得自己创建函数来实现该组织树的递归查询.以 ...

  9. mysql 单标递归_MYSQL递归树查询的实现

    ​    在oracle中我们可以使用connect by prior 函数来实现组织树表递归的查询,但是在mysql中却没有该方法,为了能够使用该方法我们就得自己创建函数来实现该组织树的递归查询.以 ...

最新文章

  1. Linux基础操作优化
  2. 在语言中的运算符中,处于同一优先级别的运算符还分优先次序吗?
  3. 9.6 shell脚本应用3
  4. 首届魔都ArchData技术峰会进入倒计时
  5. html怎么让字体自动变色,html怎么给字体设置颜色
  6. 盛夏七月,欢迎来京城看“火烧云”
  7. app软件测试的意义,APP测试用例的作用是什么
  8. WAP常见问题问答大全
  9. VS2008安装Mercurial插件
  10. PowerDesign逆向生成数据表结构PDM文件
  11. 图片转换成文字的在线转换方法
  12. iOS 11 NSPhotoLibraryAddUsageDescription 错误的解决办法
  13. Android 时间显示控件 TextClock
  14. 2380318-57-8,Thalidomide-O-PEG4-Azide通过点击化学与炔烃或DBCO、BCN连接的分子反应的PROTAC连接物
  15. 电商类微信平台推广方法有哪些?
  16. Nodejs 服务端MVC架构
  17. A题 海岛争霸
  18. FMODE学习之-------第一站
  19. Robomongo简介
  20. 28个Metpy绘图代码

热门文章

  1. 生成step文件_利用opencv给彦女王生成一副蒙太奇画像
  2. 设计模式_2_单例模式
  3. 【Pytorch神经网络实战案例】19 神经网络实现估计互信息的功能
  4. 二十、MySQL之用户权限管理(用户管理、权限管理、忘记root密码的解决方案)
  5. LeetCode MySQL 1661. 每台机器的进程平均运行时间
  6. LeetCode 1832. 判断句子是否为全字母句
  7. LeetCode 1053. 交换一次的先前排列
  8. LeetCode 211. 添加与搜索单词 - 数据结构设计(Trie树)
  9. redis 计数 java_redission计数器实现,redisTemplate计数器
  10. 修改软件服务器json返回数据格式,AngularJS处理服务器端返回的JSON数据的格式问题...