$dbname = ''
$dsn = "mysql:host=$host,dbname=$dbname"
try {
$dbh = new PDO($dsn, 'root', 'root')
} catch (PDOException $e) {
die($e -> getMessage())
}
$child = function ($id) use($dbh) {
static $final = []
$sql = "SELECT * FROM tablename WHERE id = $id" // 找出需要查询的数据
$data = $dbh -> query($sql) -> fetch(PDO::FETCH_ASSOC)
$final[] = $data
$sql = "SELECT * FROM tablename WHERE pid = " . $data['id'] // 找出当前数据的子孙数据
$datas = $dbh -> query($sql) -> fetchall(PDO::FETCH_ACCOS)
foreach ($datas as $value) {
child($value['id']) // 无限递归
}
return $final
}
$id = 1 // 需要查询的数据ID
$final = $child($id)
var_dump($final)
我代码中有一段类似的,也是网上找的,你可以参考下
SELECT CATE_CODE AS ID,PARENT_CODE AS 父ID ,levels AS 级数, paths AS 路径 FROM (
SELECT CATE_CODE,PARENT_CODE,
@le:= IF (PARENT_CODE = 0 ,0,
IF( LOCATE( CONCAT('|',PARENT_CODE,':'),@pathlevel) >0 ,
SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',PARENT_CODE,':'),-1),'|',1) +1
,@le+1) ) levels
, @pathlevel:= CONCAT(@pathlevel,'|',CATE_CODE,':', @le ,'|') pathlevel
, @pathnodes:= IF( PARENT_CODE =0,',0',
CONCAT_WS(',',
IF( LOCATE( CONCAT('|',PARENT_CODE,':'),@pathall) >0 ,
SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',PARENT_CODE,':'),-1),'|',1)
,@pathnodes ) ,PARENT_CODE ) )paths
,@pathall:=CONCAT(@pathall,'|',CATE_CODE,':', @pathnodes ,'|') pathall
FROM doc_category,
(SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='') vv
ORDER BY PARENT_CODE,CATE_CODE
) src
ORDER BY CATE_CODE
给你个网上写的比较好的例子:方法一:利用函数来得到所有子节点号。
创建一个function getChildLst, 得到一个由所有子节点号组成的字符串.
mysql>delimiter //
mysql>
mysql>CREATE FUNCTION `getChildLst`(rootId INT)
->RETURNS varchar(1000)
->BEGIN
-> DECLARE sTemp VARCHAR(1000)
-> DECLARE sTempChd VARCHAR(1000)
->
-> SET sTemp = '$'
-> SET sTempChd =cast(rootId as CHAR)
->
-> WHILE sTempChd is not null DO
->SET sTemp = concat(sTemp,',',sTempChd)
->SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)>0
-> END WHILE
-> RETURN sTemp
->END
->//
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>delimiter
使用我们直接利用find_in_set函数配合这个getChildlst来查找
mysql>select getChildLst(1)
+-----------------+
| getChildLst(1) |
+-----------------+
| $,1,2,3,4,5,6,7 |
+-----------------+
1 row in set (0.00 sec)
mysql>select * from treeNodes
->where FIND_IN_SET(id, getChildLst(1))
+----+----------+------+
| id | nodename | pid |
+----+----------+------+
| 1 | A|0 |
| 2 | B|1 |
| 3 | C|1 |
| 4 | D|2 |
| 5 | E|2 |
| 6 | F|3 |
| 7 | G|6 |
+----+----------+------+
7 rows in set (0.01 sec)
mysql>select * from treeNodes
->where FIND_IN_SET(id, getChildLst(3))
+----+----------+------+
| id | nodename | pid |
+----+----------+------+
| 3 | C|1 |
| 6 | F|3 |
| 7 | G|6 |
+----+----------+------+
3 rows in set (0.01 sec)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)