insert into t_test(id,name,parentid)value('1','一级菜单','0');
insert into t_test(id,name,parentid)value('11','二级菜单','1');
insert into t_test(id,name,parentid)value('111','三级菜单','11');
insert into t_test(id,name,parentid)value('2','一级菜单','0');
根据子节点查找所有父级节点
select
@r as _id,
(select name from t_test where id = _id) as name,
(select @r := parentid from t_test where id = _id) as parentid
(select @r := '111') temp,t_test a
where @r!=0
1、表关联时包含所有记录(没有关联条件)
2、遍历表关联结果集时,第一次@r='111',通过【 (select @r := parentid from t_test where id = _id) as parentid 】子查询将@r := parentid,所以当进行第二次时,@r=‘11’,依次类推,最后通过 @r != 0 进行过滤
在 SQL Server 中,使用 CTE 表达式很容易做到无限层次父子关系查询;在不支持CTE表达式的版本中,借助函数递归也可以轻松实现。
在
MySQL
中,这个需求的实例稍显复杂,
MySQL
中没有支持递归的查询,没有表值函数,函数不支持递归,所以通常都是用循环实现,显得比较别扭。今天看到一个用单条语句实现的递归查询,想法独特,分享一下。
表结构和数据
CREATE TABLE table1(id int, name varchar(10), parent_id int);
INSERT table
<meta charset="utf-8">
<title>copyright by leiflyy--leiflyy@outlook.com--</title>
<script src="js/ionic.bundle.
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` int(11) DEFAULT NULL,
`tname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT ...
FROM (
SELECT @r AS id,
(SELECT @r := parent_id FROM department WHERE id = @r) AS tmp_parent_id
FROM (SELECT @r := 9) leafNodeId,
department hd) d2
INNER JOIN department d3 ON d2.id = d3.id AND d2.tmp_parent_id is not null
1、可以使用类似Java这种面向对象的语言,对
节点
集合进行逻辑处理,获取
父节点
。
2、直接自定义
MySQL
函数getParentNodeList,通过一层while循环,实现对指定
节点
的所有父
子节点
进行查询。
1、创建数据表
1)表结构截图如下(此处简单建一张表t_tre...