用php调用mysql数据表中指定id下所有的子子孙孙数据;

用php调用mysql数据表中指定id下所有的子子孙孙数据;,第1张

写一个递归函数即可。

$host = ''

$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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7675435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存