Php 如何删除父\u id=>id结构中的树
我有一个数据库表目录,它使用parent_id=>id结构映射出一个树 我有另一个表文件,它将文件映射到第一个表目录\u id=>directories.id中的项 我希望能够做到的是,给定第一个表中的id,删除第二个表中与同一树中所选id相等或以上的所有行 然后删除第一个表中同一树中相等或向上的所有行 解释它的最好方法是一个文件系统,删除一个目录,它会删除它下面的所有内容 我能想到的唯一方法就是使用半个伪代码Php 如何删除父\u id=>id结构中的树,php,mysql,recursion,tree,Php,Mysql,Recursion,Tree,我有一个数据库表目录,它使用parent_id=>id结构映射出一个树 我有另一个表文件,它将文件映射到第一个表目录\u id=>directories.id中的项 我希望能够做到的是,给定第一个表中的id,删除第二个表中与同一树中所选id相等或以上的所有行 然后删除第一个表中同一树中相等或向上的所有行 解释它的最好方法是一个文件系统,删除一个目录,它会删除它下面的所有内容 我能想到的唯一方法就是使用半个伪代码 $id = :id $files = array(); $directories =
$id = :id
$files = array();
$directories = array($id);
delete_tree($query:results, $files, $directories);
function delete_tree($id, &$files, &$directories){
$query = SELECT `id` FROM `directories` WHERE `parent_id` = $id;
foreach($query:results as $directory){
$directories[] = $directory:id;
$query2 = SELECT `id` FROM `files` WHERE `directory_id` = $directory:id;
foreach($query2:results as $file){
$files[] = $file:id
}
delete_tree($directory:id, $files, $directories);
}
}
$query = DELETE from `directories` WHERE `id` IN (explode(',', $directories));
$query = DELETE from `files` WHERE `id` IN (explode(',', $files));
您可以尝试使用递归sql- 您可以在这里找到信息: 四岁以下。。您可以找到所需sql条件的示例 下面是示例代码:
SELECT
nav.id,
nav.title
FROM
(
SELECT
@rownum := @rownum+1 AS rownum,
IF(@lastid <> mylist.id, @id := mylist.id, @id) AS pathid,
@lastid := mylist.id AS id,
@id := (SELECT parentID FROM nav WHERE id = @id) AS parentID
FROM
(SELECT @id := 0, @lastid := 0, @rownum := 0) AS vars,
(SELECT id FROM nav) AS myloop,
(SELECT id FROM nav) AS mylist
) AS t
INNER JOIN nav
ON t.id = nav.id
WHERE
pathid = 2 // all subitems from id=2
我会通过数据库约束来实现 假设我有下列表格 我可以定义这两种关系,以便通过删除主记录来级联删除记录 phpMyAdmin中的示例: //目录 //档案 现在我删除id=10的目录03 //目录 //档案 如您所见,这两个表中的所有记录(都是节点的子项)都已删除。非常快,没有任何脚本 这里是一个小垃圾场:
CREATE TABLE IF NOT EXISTS `directories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`parent_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1250 AUTO_INCREMENT=13 ;
INSERT INTO `directories` (`id`, `name`, `parent_id`) VALUES (0, 'root', 0),(6, '02', 0), (10, '03', 0),(11, '031', 10),(12, '032', 10);
CREATE TABLE IF NOT EXISTS `files` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`directory_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `directory_id` (`directory_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1250 AUTO_INCREMENT=7 ;
INSERT INTO `files` (`id`, `name`, `directory_id`) VALUES (2, '031_f01', 11),(3, '031_f02', 11),(4, '02_f01', 6),(6, '02_f02', 6);
ALTER TABLE `directories`
ADD CONSTRAINT `directories_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `directories` (`id`) ON DELETE CASCADE;
ALTER TABLE `files`
ADD CONSTRAINT `files_ibfk_1` FOREIGN KEY (`directory_id`) REFERENCES `directories` (`id`) ON DELETE CASCADE;