MySql利用父id递归向下查询子节点的方法实例

不用写存储过程,不用建数据库函数,一段sql就可以实现

不用写存储过程,不用建数据库函数,一段sql就可以实现

不用写存储过程,不用建数据库函数,一段sql就可以实现

SELECT
	ID.LEVEL,
	DATA.*
FROM
	(
	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( region_id ) FROM region WHERE FIND_IN_SET(parent_id, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL
	FROM
		region,
		( SELECT @ids := 3, @l := 0 ) b
	WHERE
		@ids IS NOT NULL
	) ID,
	region DATA
WHERE
	FIND_IN_SET( DATA.region_id, ID._ids )
ORDER BY
	LEVEL

测试

--创建测试环境
create table t_test(
	id int PRIMARY key,
	parent_id int,
	name varchar(200)
)

insert t_test VALUES(1,null,"中国");

insert t_test VALUES(2,1,"华北");

insert t_test VALUES(3,2,"山西省");
insert t_test VALUES(4,2,"北京");

insert t_test VALUES(5,3,"临汾市");
insert t_test VALUES(6,4,"北京市");

insert t_test VALUES(7,5,"尧都区");
insert t_test VALUES(8,6,"朝阳区");

insert t_test VALUES(9,7,"解放西路");
insert t_test VALUES(10,8,"朝阳北路");

SELECT * FROM t_test;

测试数据展示

查询 id=1,查询中国下边有哪些地方

SELECT
	ID.LEVEL,
	DATA.*
FROM
	(
	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( id ) FROM t_test WHERE FIND_IN_SET(parent_id, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL
	FROM
		t_test,
		( SELECT @ids := 1, @l := 0 ) b
	WHERE
		@ids IS NOT NULL
	) ID,
	t_test DATA
WHERE
	FIND_IN_SET( DATA.id, ID._ids )
ORDER BY
	LEVEL

id=3,查询山西下边有哪些地方

SELECT
	ID.LEVEL,
	DATA.*
FROM
	(
	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( id ) FROM t_test WHERE FIND_IN_SET(parent_id, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL
	FROM
		t_test,
		( SELECT @ids := 3, @l := 0 ) b
	WHERE
		@ids IS NOT NULL
	) ID,
	t_test DATA
WHERE
	FIND_IN_SET( DATA.id, ID._ids )
ORDER BY
	LEVEL

id=4,查询北京下边有哪些地方

最后再从 id=2 华北地区往下查询

总结 

到此这篇关于MySql利用父id递归向下查询子节点的文章就介绍到这了,更多相关MySql递归查询子节点内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql 递归查找菜单节点的所有子节点的方法

    背景 项目中遇到一个需求,要求查处菜单节点的所有节点,在网上查了一下,大多数的方法用到了存储过程,由于线上环境不能随便添加存储过程, 因此在这里采用类似递归的方法对菜单的所有子节点进行查询. 准备 创建menu表: CREATE TABLE `menu` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单id', `parent_id` int(11) DEFAULT NULL COMMENT '父节点id', `menu_name` varch

  • 使用递归删除树形结构的所有子节点(java和mysql实现)

    1.业务场景 有如下树形结构: +-0 +-1 +-2 +-4 +-5 +-3 如果删除某个父节点,则其子节点,以及其子节点的子节点,以此类推,需要全部删除. 2.Java实现 使用Map存储树形结构的数据,id为map的key,pid为树形结构的value. import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.uti

  • MySQL递归查询树状表的子节点、父节点具体实现

    简介:mysql5.0.94版本,该版本以及较高级的版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算是照搬了,父节点查询是逆思维弄的. 表结构和表数据就不公示了,查询的表user_role,主键是id,每条记录有parentid字段(对应该记录的父节点,当然,一个父节点自然会有一个以上的子节点嘛) 复制代码 代码如下: CREATE FUNCTION `g

  • MySql利用父id递归向下查询子节点的方法实例

    不用写存储过程,不用建数据库函数,一段sql就可以实现 不用写存储过程,不用建数据库函数,一段sql就可以实现 不用写存储过程,不用建数据库函数,一段sql就可以实现 SELECT ID.LEVEL, DATA.* FROM ( SELECT @ids AS _ids, ( SELECT @ids := GROUP_CONCAT( region_id ) FROM region WHERE FIND_IN_SET(parent_id, @ids ) ) AS cids, @l := @l + 1

  • Mysql表数据比较大情况下修改添加字段的方法实例

    前言 如果一张表在后期的维护中,发现需要加字段以满足当下的需求,但是数据量很大有百万甚至千万级的数据,要如何修改表字段呢. 直接执行使用alter语句肯定是不现实的,这涉及到锁表重建表结构等操作,假设这时候还有其他线程在跑,等一天都改不过来. 这里整理一个比较简单的方法 1.对照要操作的表结构创建一张临时表 CREATE TABLE product_copy LIKE product; 2.将要修改的表结构改在临时表上面 3.导出表product数据,并导入到零时表product_copy 4.

  • jquery的父、子、兄弟节点查找,节点的子节点循环方法

    jQuery.parent(expr)           //找父元素 jQuery.parents(expr)          //找到所有祖先元素,不限于父元素 jQuery.children(expr)        //查找所有子元素,只会找到直接的孩子节点,不会返回所有子孙 jQuery.contents()            //查找下面的所有内容,包括节点和文本. jQuery.prev()                //查找上一个兄弟节点,不是所有的兄弟节点 jQue

  • zTree获取当前节点的下一级子节点数实例

    使用zTree插件实现树形图中,需要获取当前点击的父节点的子节点数的需求,使用treeNode.children获取子节点数据集合,使用length方法获取集合长度. 将当前节点的treeNode传入即可调用. /*查找当前节点下一级的子节点数*/ function findNodes(treeNode) { var count; /*判断是不是父节点,是的话找出子节点个数,加一是为了给新增节点*/ if(treeNode.isParent) { count = treeNode.childre

  • 在父页面得到zTree已选中的节点的方法

    本文实例讲述了在父页面得到zTree已选中的节点的方法.分享给大家供大家参考.具体如下: 将zTree放在一个iframe里: zTreeObj = $("#treeDemo").zTree(setting, zNodes); 如果在当前页面的话,通过 var nodes = zTreeObj.getCheckedNodes(); 即可 那么点击父页面的按钮,如何得到zTree已选中的节点? 假设iframe的id和name为aa(id和name都设置,兼容性问题) window.fr

  • 如何在Linux操作系统下安装Apache服务的方法实例详解

    链接下载: 操作环境 VMware虚拟机中CentOS 7.6 SecureCRT Xftp(Xmanager) 需求分析 使用Apache服务实现访问http 操作步骤 1.挂载光盘 [root@localhost ~]# mount /dev/cdrom /mnt 查看是否挂载 [root@localhost ~]# df -Th 2.从源码包编译安装程序 (编译安装) [root@localhost Packages]# yum -y install gcc gcc-c++ make 3.

  • python json 递归打印所有json子节点信息的例子

    我就废话不多说了,直接上代码吧 def json_txt(self, dic_json): #self.debug_print("json_txt") if isinstance(dic_json, dict): # 判断是否是字典类型isinstance 返回True false for key in dic_json: #dic_json = json.loads(s) s = dic_json[key] #self.debug_print(str(len(s)) + "

  • mysql查询上下级机构的方法实例

    目录 前言 思路: (1)准备测试数据表 (2)查询指定机构的所有下级机构(包括自身) (3)查询指定机构的所有上级机构(包括自身) 总结 前言 查询上下级机构,这个功能可能会在日常工作中遇到,如果使用的oracle数据库,那就很简单,只需要使用oracle提供的层级查询即可实现.如果使用的mysql数据库,那么就需要自己实现这个功能.下面就介绍mysql实现上下级机构查询. 思路: 自定义mysql方法 利用mysql中的[FIND_IN_SET][group_concat]两个方法 (1)准

  • javascript获取网页中指定节点的父节点、子节点的方法小结

    我们在实际的开发当中经常要获取页面中某个html元素,动态的更新该元素的样式.内容属性等. 那么如何获取要更新的这些元素呢?用JavaScript获取这些节点的方法有很多种,下面是总结的一些方法. 1. 通过document节点获取: (1) document.getElementById(elementId):该方法通过节点的ID,可以准确获得需要的元素,是比较简单快捷的方法.如果页面上含有多个相同id的节点,那么只返回第一个节点. 如 今,已经出现了如prototype.Mootools等多

  • JS获取子节点、父节点和兄弟节点的方法实例总结

    本文实例讲述了JS获取子节点.父节点和兄弟节点的方法.分享给大家供大家参考,具体如下: 一.js获取子节点的方式 1. 通过获取dom方式直接获取子节点 其中test的父标签id的值,div为标签的名字.getElementsByTagName是一个方法.返回的是一个数组.在访问的时候要按数组的形式访问. var a = document.getElementById("test").getElementsByTagName("div"); 2. 通过childNo

随机推荐