Mysql中的递归层次查询(父子查询)
最近遇到了一个问题,在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中的递归层次查询(父子查询)相关推荐
- Mysql中的递归层次查询(父子查询,无限极查询)
前言:最近面试的时候遇到公司要求只能用SQL来查询无限极的数据,不能用PHP程序做递归查询,现在分享方法. 下面给出一个function来完成的方法 下面是sql脚本,想要运行的直接赋值粘贴进数据库即 ...
- MySql中怎样使用case-when实现判断查询结果返回
场景 在对Mysql中的数据查询时,某些字段比如是否怎样样,在数据库中存储的是0和1. 如果想在查询时根据值是0和1进而返回是和否怎样编写查询语句. 注: 博客: https://blog.csdn. ...
- mysql中如何取消1000行的查询限制?
在使用数据库时,常常会有需要使用select语句查询表的情况.当使用select * 进行查询时,mysql中默认查询表的前1000行,也就是说如果表中的数据库超过了1000行,查询结果就会显示不完整 ...
- MySQL数据库03(MySQL的存储引擎 DML语句 父子查询 )
一.1.MySQL的存储引擎 储存引擎的类型:MyISAM.InnoDB. Memory.CSV等九种 MyiSAM和InnoDB类型主要区别 名称 InnoDB MyISAM 事务处理 支持 不支持 ...
- SQL优化之一则MySQL中的DELETE、UPDATE 子查询的锁机制失效案例
关注"数据和云",精彩不容错过 前言 开发与维护人员避免不了与 in/exists.not in/not exists 子查询打交道,接触过的人可能知道 in/exists.not ...
- MySQL中的LEFT JOIN ON (where)查询
LEFT JOIN ON的使用语法: select [需要查询的字段] from [table_name1] left join [table_name2] on [两个表关联的条件] (where ...
- mysql中3张表如何关联查询_mysql三张表关联查询
三张表,需要得到的数据是标红色部分的.sql如下: select a.uid,a.uname,a.upsw,a.urealname,a.utel,a.uremark, b.rid,b.rname,b. ...
- node.js mysql 不退出,mysql - 错误:使用NodeJS在MySQL中调用退出后无法排队查询 - SO中文参考 - www.soinside.com...
我正在尝试运行此NodeJs代码以在Mysql DB中添加数据:app.post("/taxi",(req,res)=>{ let model=req.body.model; ...
- mysql中的union用法以及子查询综合应用
union查询就是把2条或者多条sql语句的查询结果,合并成一个结果集. 如:sql1: N行,sql2: M行,sql1 union sql2 ---> N+M行 1.能否从2张表查询再uni ...
最新文章
- linux awk 多分隔符
- acm算法模板(2)
- Android 基础教程之-------Android ProgressBar的使用!
- 【蓝桥杯单片机】NE555在CT107D上的使用
- 2017-3-17 SQL server 数据库 视图,事务,备份还原,分离附加
- Linux 系统服务之间 实现免密登陆
- SQL Server 日期+4位流水号
- 计算机维护需要那些工具,电脑从菜鸟到扫盲第一篇之维修工具选择
- 逆向基础——软件手动脱壳技术入门
- 加速度、陀螺仪传感器工作原理
- linux上编译stm32工程,Linux下如何搭建stm32开发环境
- java 加水印_Java添加水印(图片水印,文字水印)
- 毕设论文word转pdf(错误!未定义书签。 已解决)
- 智己让上汽的高端梦第一次落地
- 离散 单射 满射 双射
- 【RNAseq】差异分析
- 软件产品化, 国内IT人之痛
- css特效实现透明渐变
- scatter的用法 随机颜色_PS上最强的颜色神器插件“达芬奇配色”正式发布!文末双十一活动!全年最低价!...
- 微信棋牌游戏最新防封号措施
热门文章
- python函数赋值函数_python 函数参数赋值过程
- PHP提高redis命中率,怎么提高redis缓存命中率
- python 判断字典key是否存在_神奇的VBA字典,判断数据是否重复
- tp5 日期范围查询_VB实战应用 | 如何巧妙解决日期范围查询问题
- 算法的优缺点_机器学习算法优缺点 amp; 如何选择
- oracle更改文件,Oracle修改数据文件名以及移动数据文件
- c语言判断一个点在长方体内部_21个入门练手项目,让你轻松玩转C语言
- 树莓派3 kali linux很卡,树莓派3装kali Linux 成功写入 但是点不亮 为什么?
- (9) ebj学习: Jpa的增删查改,CURD方法监听和命名查询
- 2019年末逆向复习系列之努比亚Cookie生成逆向分析