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');