美文网首页
MySql 递归层次查询(父子查询)

MySql 递归层次查询(父子查询)

作者: 额嗬 | 来源:发表于2017-09-14 15:40 被阅读0次
欅坂46

前言

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

创建数据表

下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。

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;

插入几条数据

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');

创建函数

根据传入id查询所有父节点的id

CREATE FUNCTION `getParLst`(rootId INT)
RETURNS varchar(1000) 

BEGIN
    DECLARE sTemp VARCHAR(1000);
    DECLARE sTempPar VARCHAR(1000); 
    SET sTemp = ''; 
    SET sTempPar =rootId; 
    
    #循环递归
    WHILE sTempPar is not null DO 
        #判断是否是第一个,不加的话第一个会为空
        IF sTemp != '' THEN
            SET sTemp = concat(sTemp,',',sTempPar);
        ELSE
            SET sTemp = sTempPar;
        END IF;

        SET sTemp = concat(sTemp,',',sTempPar); 
        SELECT group_concat(pid) INTO sTempPar FROM treenodes where pid<>id and FIND_IN_SET(id,sTempPar)>0; 
    END WHILE; 
    
RETURN sTemp; 
END

执行命令

select * from treenodes where FIND_IN_SET(id,getParList(15));
结果

根据传入id查询所有子节点的id

CREATE FUNCTION `getParLst`(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

执行命令

select * from treenodes where FIND_IN_SET(id,getChildList(7));
结果

注意

如果返回数据量过多的话,设置的'varchar(1000)'是不够的,将返回类型改为 'mediumtext' 即可.

相关文章

  • MySql 递归层次查询(父子查询)

    前言 最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?在Oracle中...

  • MySql递归查询实现父子查询

    父子查询 根据父id查询下面所有子节点数据。 功能需求 我们这里以sec_org(部门表)为例,在一个部门表里面包...

  • MySQL

    mysql递归查询组织机构mysql 递归查询 MySQL教程之concat以及group_concat的用法 M...

  • mysql实现递归查询

    mysql中没有提供递归查询的语句,我们通过mysql函数实现这种查询。 对于如下一张表privilege,递归查...

  • 【MySQL】递归查询上下级

    环境 需要MySQL8.0+ 上下级关系图 建表语句 查询上下级sql语句 递归,查询本级以及所有下级 递归,查询...

  • 教你如何使用 MySQL8 递归

    之前写过一篇 MySQL通过自定义函数的方式,递归查询树结构,从MySQL 8.0 开始终于支持了递归查询的语法 ...

  • oracle树形结构层级查询之start with ....co

    浅谈oracle树状结构层级查询 原文地址:浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查...

  • Mysql递归查询

    ms sqlserver数据库,支持with as 语法中直接递归调用。但mysql并不支持with as 语法,...

  • mysql递归查询

    在项目中会遇到同一个表中保存着父子关系的数据,最常见的就是处理树形结构资源。下面举个简单的例子,先看一下表: 然后...

  • mysql递归查询

    表如上: 调动语句:

网友评论

      本文标题:MySql 递归层次查询(父子查询)

      本文链接:https://www.haomeiwen.com/subject/viedsxtx.html