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
现在插入一些简单的假数据:
现在我们来看如何实现的三种情况。
一、通过某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
结果:
以上就是三种情况的实现。
注意新手直接复制粘贴。 因为里面的变量问题很容易出错。
希望对新手有帮助。大佬勿喷。依葫芦画瓢写出来的东西。 也不太明白实现的逻辑和原理。