当前位置:网站首页>MySQL 递归查找树形结构,这个方法太实用了!
MySQL 递归查找树形结构,这个方法太实用了!
2022-06-22 02:12:00 【Java笔记虾】
点击关注公众号,利用碎片时间学习
这两天,遇到了子节点的需求。这里简单做个总结。
1、数据库中的树形结构
数据库中存贮的数据,以ID和P_ID(父id),来存贮树形结构
这样如果需要查找某个节点的子节点,就可以寻找P_ID。如果要查找所有子节点,就需要遍历所有的子节点的子节点。
如果要判断是否为同级的节点,就可以查找是否有相同的父节点。
2、MySQL中如何查找相应的数据
这里,我采用的是写一个存贮函数。在查询时可以直接使用。当然,为了以后查询方便,也可在一个视图使用。
3、准备工作
数据库表,为了方便,只有三个字段,能够说明情况即可。
CREATE TABLE `city` (
`i_id` int(11) NOT NULL AUTO_INCREMENT ,
`p_id` int(11) NULL DEFAULT NULL ,
`c_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`i_id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=11
ROW_FORMAT=COMPACT;随便插入几条数据

实现介绍俩个关键的函数
group_concat(column_name): 多条记录合成一条记录
SELECT GROUP_CONCAT(i_id)
FROM city
WHERE p_id='2'
find_in_set(column_name, strlist)在多条记录中查询特定列
SELECT * FROM city
WHERE FIND_IN_SET(p_id,'1,4')
4.具体的实现(由浅入深)
1.只查具体一级下级
SELECT GROUP_CONCAT(i_id) AS ids
FROM city
WHERE p_id=1;
2.查询某一个节点的子节点
在存贮函数之前,要注意一点。虽然参数名是 param_i_id,但查询时 要让p_id=param_i_id
CREATE DEFINER = `root`@`localhost` FUNCTION `getSubNodes`(param_i_id int)
RETURNS varchar(100)
BEGIN
#输入I_ID 输出此I_ID下的所有子节点(只有一级)
DECLARE strSubIds VARCHAR(100);
DECLARE strPid VARCHAR(100);
SET strSubIds = '$';
SET strPid =cast(param_i_id as CHAR);
SELECT GROUP_CONCAT(i_id) INTO strSubIds FROM city WHERE p_id=strPid;
RETURN strSubIds;
END;这样,可以就可以在查询语句中使用

3.查询所有下级
查到了一级,只要循环查询到某一个节点(这个节点没有子节点),就结束
CREATE DEFINER = `root`@`localhost` FUNCTION `getAllSubNodes`(`param_i_id` int)
RETURNS varchar(100)
BEGIN
DECLARE strAllSubIds VARCHAR(100);
DECLARE strTempPid VARCHAR(100);
#先得到第一级,也可以掉用getSubNodes(param_i_id);
# SELECT GROUP_CONCAT(i_id) INTO strAllSubIds FROM city WHERE p_id=param_i_id;
SET strAllSubIds = getSubNodes(param_i_id);
SET strTempPid = strAllSubIds;
#根据 strTempPid 判断是否还有子节点
WHILE strTempPid is not null DO
SELECT group_concat(i_id) INTO strTempPid FROM city WHERE FIND_IN_SET(p_id,strTempPid)>0;
#需要对strTempPid判断,非空用 , 连接
IF (strTempPid is not NULL) THEN
SET strAllSubIds = concat(strAllSubIds,',',strTempPid);
END IF;
END WHILE;
RETURN strAllSubIds;
END;
来源:blog.csdn.net/qq_34120430/article/
details/84969235
推荐:

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
边栏推荐
- 微信小程序影視評論交流平臺系統畢業設計畢設(4)開題報告
- Chrome浏览器取消输入框记录表单输入历史
- Efficient packet processing system based on dpdk
- 小孩子学什么编程?
- idea----复制黏贴
- Chrome browser cancel input box to record form input history
- Chapter 25 digital watermarking technology based on Wavelet Transform
- excel常用快捷键excel快捷键汇总
- acwing 836. Merge sets (merge sets)
- Mathematical knowledge in the first round of noip preliminary round csp-j1 csp-s1 Sinorgchem (III)
猜你喜欢
![[Chapter 17 corner feature detection based on Harris -- actual combat of MATLAB machine learning project]](/img/41/211f6603a6854b427321c50127c2a4.png)
[Chapter 17 corner feature detection based on Harris -- actual combat of MATLAB machine learning project]
![[Chapter 14 image compression and reconstruction based on principal component analysis -- matlab deep learning practical case]](/img/fa/a3ff1c0213d953f7ef8a01ea7672b9.png)
[Chapter 14 image compression and reconstruction based on principal component analysis -- matlab deep learning practical case]

Wechat applet film and television review and exchange platform system graduation design completion (8) graduation design thesis template

Mysql database easy learning 09 - commonly used by data analysts: multi table query of data query language DQL

word文档转markdown文档?

Games-101 personal summary rasterization

Flexer series: indexedstack in Flexer

Minecraft 1.18.2 生化8 模组 1.3版本 物品3D化+更加复杂村庄

Word document to markdown document?

Chapter 18 build a general video processing tool based on GUI matlab application GUI implementation
随机推荐
Mysql database easy learning 09 - commonly used by data analysts: multi table query of data query language DQL
通信尾纤常用尾纤简介
Mysql数据库轻松学09—数据分析师常用:数据查询语言DQL之多表查询
Common shortcut keys in Excel summary of shortcut keys in Excel
Return to Chengdu to start my software testing career
How to restore the IE browser auto jump edge
Chapter 03 extraction of anterior segment tissue based on multi-scale morphology - full system matlab intelligent driving in-depth learning
idea----bookmark
idea----复制黏贴
博途PLC和CODESYS平台下FB编程(如何实现100路FB循环遍历执行)
What is your understanding of interface testing?
Dachang NVIDIA face test questions sorting 123
剑指offer 26:树的子结构
LeetCode 513 找树左下角的值[BFS 二叉树] HERODING的LeetCode之路
如何获取自由和财富
【随笔】昨天研究了一天 RN 生态的 Expo 的确牛逼,从开发构建到部署一条龙,很好使。
acwing 835. Trie string statistics
Mba-day18 elimination method
Who will use pyspark to upload filtered local data to spark SQL
C # judge whether the application is started and displayed