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

最近要实现一个查看历史记录的功能。 在网上查了很多资料。 都是通过某一节点获取父节点或者获取子节点信息。 没有看到通过某一节点获取子节点以及父节点的所有信息。 很苦恼。 之后在一篇博客上看到通过某一节点获取父节点信息的一条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

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

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

 

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

 

一、通过某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
            

结果:

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

 

二、通过某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

结果:

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

 

三、最后一种情况就是把一个给整合起来。通过某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

 

结果:

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

 

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

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

希望对新手有帮助。大佬勿喷。依葫芦画瓢写出来的东西。 也不太明白实现的逻辑和原理。