文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL递归查找树形结构(这个方法太实用了!)

2024-04-02 19:55

关注

这两天,遇到了重要节点的需求。这里简单做个总结。

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;

随便插入几条数据

MySQL递归查找树形结构(这个方法太实用了!)

实现介绍两个关键的函数

group_concat(column_name): 多条记录合成一条记录

SELECT GROUP_CONCAT(i_id)
FROM city
WHERE p_id='2'

MySQL递归查找树形结构(这个方法太实用了!)

find_in_set(column_name, strlist)在多条记录中查询特定列

SELECT * FROM city
WHERE FIND_IN_SET(p_id,'1,4')

MySQL递归查找树形结构(这个方法太实用了!)

4.具体的实现(由浅入深)

1.只查具体一级下级

SELECT GROUP_CONCAT(i_id) AS ids
FROM city
WHERE p_id=1;

MySQL递归查找树形结构(这个方法太实用了!)

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;

这样,就可以在查询语句中使用

MySQL递归查找树形结构(这个方法太实用了!)

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;

MySQL递归查找树形结构(这个方法太实用了!)

总结

到此这篇关于MySQL递归查找树形结构的文章就介绍到这了,更多相关MySQL递归查找树形结构内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯