java 通过某一节点获取父节点以及子节点信息

本文介绍了一种使用SQL语句从数据库中查询特定节点及其所有父节点和子节点的方法。通过三个具体的例子,展示了如何实现这一功能,适用于需要浏览层级结构数据的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近要实现一个查看历史记录的功能。 在网上查了很多资料。 都是通过某一节点获取父节点或者获取子节点信息。 没有看到通过某一节点获取子节点以及父节点的所有信息。 很苦恼。 之后在一篇博客上看到通过某一节点获取父节点信息的一条sql语句之后在上面略作修改。 把子节点的也全部获取下来了。 下面我会三种情况的实现sql做个记录。 以免以后忘记。希望这个记录对其他码友有些帮助。

以下是我的表结构:

 

CREATE TABLE `test_class_table` (
  `class_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `p_id` INT(11) DEFAULT '0' COMMENT '父节点id',
  `s_id` INT(11) DEFAULT '0' COMMENT '子节点id',
  `class_name` VARCHAR(50) DEFAULT NULL COMMENT '班级名称',
  `class_num_people` INT(50) DEFAULT '0' COMMENT '班级人数',
  `class_grade` VARCHAR(20) DEFAULT NULL COMMENT '所属年级',
  `in_date` DATETIME NOT NULL COMMENT '插入时间',
  `up_date` TIMESTAMP NULL,
  PRIMARY KEY (`class_id`)
) ENGINE=MYISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

现在插入一些简单的假数据:

 

现在我们来看如何实现的三种情况。

 

一、通过某id获取迭代父id信息  比如: 获取五年级及以上的班级信息


 SELECT t2.* FROM (

SELECT 
@r AS _id,(SELECT @r := p_id FROM test_class_table WHERE class_id = _id) AS parent_id

FROM (SELECT @r := 5,@l := 0) vars, test_class_table h 

WHERE @r != 0 

) t1 JOIN test_class_table t2 ON (t1._id = t2.class_id) ORDER BY class_id ASC
            

结果:

 

二、通过某id获取迭代子id信息  比如: 获取二年级及以下的班级信息

SELECT t2.* FROM (

SELECT 
@r AS _id,(SELECT @r := s_id FROM test_class_table WHERE class_id = _id) AS parent_id

FROM (SELECT @r := 2,@l := 0) vars, test_class_table h 

WHERE @r != 0 

) t1 JOIN test_class_table t2 ON (t1._id = t2.class_id) ORDER BY class_id ASC

结果:

 

三、最后一种情况就是把一个给整合起来。通过某id获取迭代子id以及父id的所有信息 

比如:给你个三年级的id 获取跟他有关联关系的一到六年级

SELECT t2.* FROM (

SELECT 
@r AS _pid,(SELECT @r := p_id FROM test_class_table WHERE class_id = _pid) AS parent_id,
@i AS _sid,(SELECT @i := s_id FROM test_class_table WHERE class_id = _sid) AS son_id        

FROM (SELECT @r := 3, @i := 3,@l := 0) vars, class_table h 

WHERE @r != 0 OR @i != 0 

) t1 JOIN test_class_table t2 ON (t1._pid = t2.class_id OR t1._sid = t2.class_id) ORDER BY class_id ASC

 

结果:

 

以上就是三种情况的实现。

注意新手直接复制粘贴。 因为里面的变量问题很容易出错。

希望对新手有帮助

 

每次查询变量变更的顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值