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

下面给出一个function来完成的方法

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

创建表treenodes(可以根据需要进行更改)

12345678910
-- ---------------------------- -- 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;

插入几条数据

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

把下面的语句直接粘贴进命令行执行即可(注意修改传入的参数,默认rootId,表明默认treenodes)

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

1234567891011121314151617181920212223242526
delimiter // 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 nodename pid
8 H 0
9 I 8
12 L 9
15 O 12

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

123456789101112131415161718
delimiter // 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));

结果:

id nodename pid
7 G 6

Mysql中的递归层次查询(父子查询)相关推荐

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

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

  2. MySql中怎样使用case-when实现判断查询结果返回

    场景 在对Mysql中的数据查询时,某些字段比如是否怎样样,在数据库中存储的是0和1. 如果想在查询时根据值是0和1进而返回是和否怎样编写查询语句. 注: 博客: https://blog.csdn. ...

  3. mysql中如何取消1000行的查询限制?

    在使用数据库时,常常会有需要使用select语句查询表的情况.当使用select * 进行查询时,mysql中默认查询表的前1000行,也就是说如果表中的数据库超过了1000行,查询结果就会显示不完整 ...

  4. MySQL数据库03(MySQL的存储引擎 DML语句 父子查询 )

    一.1.MySQL的存储引擎 储存引擎的类型:MyISAM.InnoDB. Memory.CSV等九种 MyiSAM和InnoDB类型主要区别 名称 InnoDB MyISAM 事务处理 支持 不支持 ...

  5. SQL优化之一则MySQL中的DELETE、UPDATE 子查询的锁机制失效案例

    关注"数据和云",精彩不容错过 前言 开发与维护人员避免不了与 in/exists.not in/not exists 子查询打交道,接触过的人可能知道 in/exists.not ...

  6. MySQL中的LEFT JOIN ON (where)查询

    LEFT JOIN ON的使用语法: select [需要查询的字段] from [table_name1] left join [table_name2] on [两个表关联的条件] (where ...

  7. mysql中3张表如何关联查询_mysql三张表关联查询

    三张表,需要得到的数据是标红色部分的.sql如下: select a.uid,a.uname,a.upsw,a.urealname,a.utel,a.uremark, b.rid,b.rname,b. ...

  8. node.js mysql 不退出,mysql - 错误:使用NodeJS在MySQL中调用退出后无法排队查询 - SO中文参考 - www.soinside.com...

    我正在尝试运行此NodeJs代码以在Mysql DB中添加数据:app.post("/taxi",(req,res)=>{ let model=req.body.model; ...

  9. mysql中的union用法以及子查询综合应用

    union查询就是把2条或者多条sql语句的查询结果,合并成一个结果集. 如:sql1: N行,sql2: M行,sql1 union sql2 ---> N+M行 1.能否从2张表查询再uni ...

最新文章

  1. linux awk 多分隔符
  2. acm算法模板(2)
  3. Android 基础教程之-------Android ProgressBar的使用!
  4. 【蓝桥杯单片机】NE555在CT107D上的使用
  5. 2017-3-17 SQL server 数据库 视图,事务,备份还原,分离附加
  6. Linux 系统服务之间 实现免密登陆
  7. SQL Server 日期+4位流水号
  8. 计算机维护需要那些工具,电脑从菜鸟到扫盲第一篇之维修工具选择
  9. 逆向基础——软件手动脱壳技术入门
  10. 加速度、陀螺仪传感器工作原理
  11. linux上编译stm32工程,Linux下如何搭建stm32开发环境
  12. java 加水印_Java添加水印(图片水印,文字水印)
  13. 毕设论文word转pdf(错误!未定义书签。 已解决)
  14. 智己让上汽的高端梦第一次落地
  15. 离散 单射 满射 双射
  16. 【RNAseq】差异分析
  17. 软件产品化, 国内IT人之痛
  18. css特效实现透明渐变
  19. scatter的用法 随机颜色_PS上最强的颜色神器插件“达芬奇配色”正式发布!文末双十一活动!全年最低价!...
  20. 微信棋牌游戏最新防封号措施

热门文章

  1. python函数赋值函数_python 函数参数赋值过程
  2. PHP提高redis命中率,怎么提高redis缓存命中率
  3. python 判断字典key是否存在_神奇的VBA字典,判断数据是否重复
  4. tp5 日期范围查询_VB实战应用 | 如何巧妙解决日期范围查询问题
  5. 算法的优缺点_机器学习算法优缺点 amp; 如何选择
  6. oracle更改文件,Oracle修改数据文件名以及移动数据文件
  7. c语言判断一个点在长方体内部_21个入门练手项目,让你轻松玩转C语言
  8. 树莓派3 kali linux很卡,树莓派3装kali Linux 成功写入 但是点不亮 为什么?
  9. (9) ebj学习: Jpa的增删查改,CURD方法监听和命名查询
  10. 2019年末逆向复习系列之努比亚Cookie生成逆向分析