1. 数据表见文章最后sql
2. 递归包含两个要素:循环体,终止条件.net
3. 向上递归code
Sql:blog
SELECT递归
@co AS 'code'开发
,( SELECT @co := c.f_code FROM tree_test c WHERE c.t_code = @co ) AS 'f_code'字符串
FROMclass
tree_test a ,( SELECT @lv := b.t_level, @co := b.t_code FROM tree_test b WHERE b.t_code = '300101') AS xtest
WHERE @lv > 0
分析:
循环体: SELECT @co := c.f_code FROM tree_test c WHERE c.t_code = @co
以每次查询的父级代码做为下次查询得分类代码条件,一层层往上查找
终止条件:层级,@lv 当查询到顶级的实时结束查询
4. 向下递归
Sql:
SELECT
@co AS 'code'
,( SELECT @co := GROUP_CONCAT(c.t_code)FROM tree_test c WHERE FIND_IN_SET(c.f_code,@co)) AS 'f_code'
FROM
tree_test a ,( SELECT @co := GROUP_CONCAT(b.t_code) FROM tree_test b WHERE b.t_code = '10') AS x
WHERE @co IS NOT NULL
分析:
循环体: SELECT @co := GROUP_CONCAT(c.t_code)FROM tree_test c WHERE FIND_IN_SET(c.f_code,@co) 以每次查询的下级代码集合做为下次查询得分类代码条件,一层层往下查找,这里用到了 分组合并字符串GROUP_CONCAT()以及字符串级查找FIND_IN_SET()
终止条件:当没有找到下级的信息时,便可认为查找完毕
5. Myql 定义变量赋值 @param := 10
(以上仅作技术研究,实际开发中避免复杂sql)
- 树级表:
CREATE TABLE `tree_test` (
`t_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`t_code` int(11) NOT NULL COMMENT '节点代码',
`t_name` varchar(200) DEFAULT NULL COMMENT '节点名称',
`f_code` int(11) NOT NULL DEFAULT '0' COMMENT '父级节点',
`t_level` int(1) NOT NULL DEFAULT '1' COMMENT '节点层级',
PRIMARY KEY (`t_id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
数据:
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('2', '10', '一级节点_1', '0', '1');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('3', '20', '一级节点_2', '0', '1');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('4', '30', '一级节点_3', '0', '1');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('5', '1001', '二级节点_1_1', '10', '2');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('6', '1002', '二级节点_1_2', '10', '2');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('7', '1003', '二级节点_1_3', '10', '2');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('8', '2001', '二级节点_2_1', '20', '2');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('9', '2002', '二级节点_2_2', '20', '2');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('10', '3001', '二级节点_3_1', '30', '2');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('11', '3002', '二级节点_3_2', '30', '2');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('12', '100201', '三级节点_1_2_1', '1002', '3');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('13', '100202', '三级节点_1_2_2', '1002', '3');
INSERT INTO `tree_test` (`t_id`, `t_code`, `t_name`, `f_code`, `t_level`) VALUES ('14', '300101', '三级节点_3_1_2', '3001', '3');