你这种表结构叫邻接表,查询的方式通过自连接。如
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也有过深入探讨,请参考!
你肯定得是两张表吧 一张是 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'
就可以查询了 ,望采纳
/*使用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;
}
SELECT * FROM table WHERE `id` = `pid`