php写函数 根据子类(id)递归查找顶级父类(id) 返回父类名字 (表结构:id name pid)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php写函数 根据子类(id)递归查找顶级父类(id) 返回父类名字 (表结构:id name pid)相关的知识,希望对你有一定的参考价值。

你这种表结构叫邻接表,查询的方式通过自连接。如

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4

FROM Tbname AS t1

LEFT JOIN Tbname AS t2 ON t2.pid = t1.id

LEFT JOIN Tbname AS t3 ON t3.pid = t2.id

LEFT JOIN Tbname AS t4 ON t4.pid = t3.id

WHERE t1.name = 'XXXX'

这种方法的主要局限是你需要为每层数据添加一个自连接,随着层次的增加,自连接

变得越来越复杂,检索的性能自然而然的也就下降了。当然这种结构在查询前必须知道该节点所处的层级,否则无法确定自连接的深度。


邻接表模型的局限性很大,用纯SQL实现有一定的难度。不妨考虑其他模型,比如嵌套模型。


嵌套模型的基本结构是树型结构,SQL检索比邻接表要方便很多。



关于嵌套模型,phpChina的第一期电子杂志PHPer也有过深入探讨,请参考!

参考技术A 你肯定得是两张表吧 一张是 table1 (id name pid ) 一张是 table 2(pid name)

多表联查:select table2.name as p_name , pid as p_id from table1 right join table2 on table1.pid=table2.pid where id=' 输入你的子类ID'

就可以查询了 ,望采纳追问

一张表

参考技术B /*使用tp5写的函数,求出父亲id,最后再将第一个传入的父类id和函数的返回值拼接起来,
然后通过查数据库求出名字,当然自己简化一下也可以一步求出父类的名字*/
public function getchild($pid)
       //根据传进来的参数查数据库是否有子类
        $data = Db::name("archives_folder")->where("pid=$pid")->select();
        //定义一个接受参数
        $ids = '';
        //判断
        if($data)
        //在有子类的情况下遍历数组
            foreach ($data as $k => $v) 
            //将子类id作为父id,然后调用自己(递归)
                $ids .= ','.$v['id'];
                $ids .=$this->getchild($v['id']);
            
        
        return $ids;
    

参考技术C SELECT * FROM table WHERE `id` = `pid`追问

没看明白问题,肯定是多级分类啊 要不怎么会要递归啊?

JavaScript根据子级id递归查找至顶级id的集合


1、代码

let recursionData = [
	
		id: 1,
		name: "一级",
		children: [
			
				id: 2,
				name: "二级-1",
				children: [
					
						id: 7,
						name: "三级-1",
						children: [
							
								id: 10,
								name: "四级-1",
							,
						],
					,
					
						id: 8,
						name: "三级-2",
					,
				],
			,
			
				id: 3,
				name: "二级-2",
				children: [
					
						id: 5,
						name: "三级-3",
					,
					
						id: 6,
						name: "三级-4",
					,
				],
			,
			
				id: 4,
				name: "二级-3",
				children: [
					
						id: 9,
						name: "三级-5",
						children: [
							
								id: 11,
								name: "四级-2",
							,
						],
					,
				],
			,
		],
	,
];

function funRecursion(list, id) 
	for (let i in list) 
		if (list[i].id == id) 
			// return [list[i]];
			return [list[i].id];
		

		if (list[i].children) 
			let node = funRecursion(list[i].children, id);
			if (node !== undefined) 
				// return node.concat(list[i]);
				return node.concat(list[i].id);
			
		
	
;

console.log(funRecursion(recursionData, 10)); // [10, 7, 2, 1]
console.log(funRecursion(recursionData, 10).reverse()); // [1, 2, 7, 10]

2、相关链接

原文链接

以上是关于php写函数 根据子类(id)递归查找顶级父类(id) 返回父类名字 (表结构:id name pid)的主要内容,如果未能解决你的问题,请参考以下文章

wordpress 父类和子类调用不同模板

java中,当实例化子类时会递归调用父类中的构造方法。这个说法对么?为啥

PHP子类能否继承父类的构造方法?

mysql递归查询语句

PHP 商品分类

php递归问题: