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

相关文章
相关标签/搜索