2011-05-27 37 views
0

我无法弄清楚如何删除子类别当我删除主类别。如何删除主类别和子类别

我做了两个查询。这适用于我删除子和子子。但是,如果我删除的类别是主要的猫。我不能删除subs子。

如果id是1,我应该在这里做些什么来删除汽车,菲亚特和熊猫?

cats_id cats_parentid cats_name 
1   0   car 
2   1   fiat 
3   2   panda 

mysql_query("DELETE FROM cats 
      WHERE cats_id='".$id."'") or die(mysql_error()); 

mysql_query("DELETE FROM cats 
      WHERE cats_parentid='".$id."'") or die(mysql_error()); 
+0

如果你的表是InnoDB,你可以创建一个关系,当你删除父行时自动处理这个关系。 – 2011-05-27 10:32:10

+0

只要先执行第二个查询 – 2011-05-27 10:34:09

+0

是的,只要先执行第二个查询。交换最后两行 – MLS 2011-05-27 10:35:53

回答

1

可以使用递归函数调用像这样(在PHP):

function delete_subcats($id) { 
    $res = mysql_query('SELECT cats_id FROM cats WHERE cats_parentid = '.$id); 

    if ($res) { 
    while ($row = mysql_fetch_assoc($res)) 
     delete_subcats($row['cats_id']); 
    } 

    mysql_query('DELETE FROM cats WHERE cats_id = '.$id); 
} 

或者如果您使用InnoDB引擎进行y我们的表,你需要创建外键

ALTER TABLE cats ADD FOREIGN KEY (cats_parentid) REFERENCES cats(cats_id) ON DELETE CASCADE; 

,并删除父记录后,所有连接的记录将通过MySQL数据库没有其他查询被删除。

+0

它并没有删除所有的子类别,当我删除主要的一个。它只是删除了具有相同ID的类别。我不能添加外键我得到这个错误'#1064 - 你的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以在第1行'REFERENCES(cats_id)ON DELETE CASCADE'附近使用正确的语法' – emre 2011-05-27 11:18:19

+0

我更新了函数和ALTER TABLE,这些都适用于我。 – Hck 2011-05-27 11:41:20

+0

好的。非常感谢。它工作完美 – emre 2011-05-27 11:44:20

0

你应该做的是删除所有儿童第一递归,例如功能:

function delete_cat($id){ 
    // Try to delete all the childrens first 
    $res = mysql_query("SELECT cats_id WHERE cats_parentid='".$id."'"); 
    while($row = mysql_fetch_row($res)){ 
     delete_cat($row['cats_id']); 
    } 

    // Then delete the cat after all the childrens are deleted 
    mysql_query("DELETE FROM cats WHERE cats_id='".$id."'"); 
} 

希望它能帮助:)

+1

这会起作用,但如果树很深并且有很多孩子,我会建议首先填充ID列表,然后在一个查询中删除它们。为了减少选择次数,应该为*父母*而不是*单亲*填充填充,即如果ID为1的父母有2个孩子的ID为2和3,那么确定2和3的项目的孩子应该作为'从(2,3)'中的parent_id类别中选择id来完成。下一个查询可能是'... where(4,5,6,7)'中的parent_id,其中ID为“4”和“5”的项目可能是“2”的子项,ID为“6”和“7” “ - ”3“的孩子。 – binaryLV 2011-05-27 10:47:00