以正确的顺序让父母递归从MySQL表中删除

Dan*_*Lee 6 php mysql recursion children parent

我有这样的表结构

mysql> SELECT id, name, parent_id FROM categories;
+-------+------------+-----------+
| id    | name       | parent_id |
+-------+------------+-----------+
| 15790 | Test       |         0 |
| 15791 | Test2      |         0 |
| 16079 | Subtest    |     15790 |
| 16080 | Subtest 2  |     15790 |
| 16081 | Subsubtest |     16079 |
+-------+------------+-----------+
Run Code Online (Sandbox Code Playgroud)

现在我想查找每个孩子和兄弟姐妹的父母,并按照正确的顺序将其删回以便删除.

所以我在这种情况下的输出是:

Array
(
  16081,
  16080,
  16079,
  15791,
  15790
)
Run Code Online (Sandbox Code Playgroud)

我不能仅仅通过反转父ID来删除,因为这应该是坚实的走回树.

此外,我无法/允许更改表的结构.因此,建立一种索引是必要的.

Zan*_*ien 6

假设您无权访问TRUNCATE,SET(所以您可以这样做SET FOREIGN_KEY_CHECKS=0;),ALTER等等,并且绝对必须使用脚本:

由于标记的问题php,这应该做的伎俩:

function reversetree($src_arr, $currentid = 0)
{
    $cats = array();
    foreach($src_arr as $id => $parent)
    {   
        if($parent == $currentid)
        {
            $cats[] = $id;
            $cats = array_merge($cats, reversetree($src_arr, $id));
        }
    }
    return !$currentid ? array_reverse($cats) : $cats;
}

$rs = array();
foreach($pdo->query('SELECT id, parent_id FROM categories') as $row)
    $rs[$row['id']] = $row['parent_id'];

$stmt = $pdo->prepare('DELETE FROM categories WHERE id = ?');

$pdo->beginTransaction();
foreach(reversetree($rs) as $v)
    $stmt->execute(array($v));
$pdo->commit();
Run Code Online (Sandbox Code Playgroud)