首页 > 数据库 >MySql通过父id递归向下查询子节点

MySql通过父id递归向下查询子节点

时间:2023-01-16 18:34:09浏览次数:45  
标签:insert 递归 ids VALUES MySql test id SELECT

不用写存储过程,不用建数据库函数,一段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

MySql通过父id递归向下查询子节点_数据库函数

测试

--创建测试环境
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;

测试数据展示
MySql通过父id递归向下查询子节点_数据库函数_02
查询 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

MySql通过父id递归向下查询子节点_数据库_03
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

MySql通过父id递归向下查询子节点_mysql_04
id=4,查询北京下边有哪些地方
MySql通过父id递归向下查询子节点_sql_05
最后再从 id=2 华北地区往下查询
MySql通过父id递归向下查询子节点_数据库_06

标签:insert,递归,ids,VALUES,MySql,test,id,SELECT
From: https://blog.51cto.com/u_14452299/6010728

相关文章

  • Redis 缓存和 MySQL 如何实现数据一致性
    需求起因在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。......
  • gradle idea sprongboot
    更换为来源https://start.spring.iohttps://start.aliyun.comidea指定版本在gradle->wrapper->gradle-wrapper.properiresdistributionUrl指定版本指定gradl......
  • IDEA2018.1创建Maven工程
    点击ok,下一步如果左侧没有显示包的话FIile>CloseProject>删除.idea文件夹>重新open......
  • 【建站系列教程】2.2、fiddler手机抓包教程
    【建站系列教程】2.2、fiddler手机抓包教程(全网最良心、实用教程)​​fiddler手机抓包原理​​​​步骤摘要​​​​详细步骤​​​​1.安装fiddler、修改配置​​​​2.......
  • 【建站系列教程】2.1、fiddler电脑抓包教程
    【建站系列教程】2.1、fiddler电脑抓包教程(全网最良心、实用教程)​​简介​​​​工作原理​​​​主界面​​​​使用前配置​​​​最常使用功能​​​​1监控请求​​......
  • 【Java】Java连接Mysql数据库的demo示例
    【Java】Java连接Mysql数据库的demo示例1.安装mysql数据库2.下载java-mysql-connector.jar包3.完成java配置4.写java代码运行测试1.安装mysql数据库这里不多重复,我主要讲......
  • 【MySQL】全局锁、表级锁、行级锁
    [1]前言  索引列数据锁的设计主要用来解决并发带来的问题。当一个业务场景中出现多用户共享同一资源,当出现并发访问的时候,数据库需要合理的控制资源的访问规则,锁就是用......
  • 【MySQL】索引不会被使用的7种情况
    [1]隐式类型转换  索引列出现了隐式类型转换(​​ImplicitTypeConversion​​​),则​​MySQL​​​不会使用索引。常见的情况是,如果在​​SQL​​​的​​WHERE​​​......
  • 【MySQL思考】触发器是否应该在生产环境中使用?
    [1]触发器简单介绍  MySQL触发器​​trigger​​​是一种存储程序,它和一个指定的表相关联,当该表中的数据发生变化(增加、更新、删除)时自动执行。这些修改数据行的操作......
  • 恒创科技:海外IDC服务商选哪个靠谱?
    ​很多用户喜欢租用海外服务器,因为其具备较大的优势,但由于海外IDC服务商很多(比国内服务商数量要多得多),导致用户很难辨别真正可靠的海外IDC服务商,其中除了一级服务商还......