Mysql 遞歸查詢

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'字符串

,@lv := @lv - 1 AS 'level'get

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)

  1. 樹級表:

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

相關文章
相關標籤/搜索