首页 / MYSQL / MySQL实现递归查找树形结构
MySQL实现递归查找树形结构
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL实现递归查找树形结构,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2489字,纯文字阅读大概需要4分钟。
内容图文
![MySQL实现递归查找树形结构](/upload/InfoBanner/zyjiaocheng/918/4e18b7b0cdf446bc832cffce17f131af.jpg)
这两天,遇到了子节点的需求.这里简单做个总结.
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;
这样,可以就可以在查询语句中使用
(上面的1.去不掉,富文本好烦)
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;
参考 : https://blog.csdn.net/bob_baobao/article/details/78104504
内容总结
以上是互联网集市为您收集整理的MySQL实现递归查找树形结构全部内容,希望文章能够帮你解决MySQL实现递归查找树形结构所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。