反复执行
 delete from Mac_Class where PraentID not in (select ClassID from Mac_Class where ClassID )
直到affected_rows为0

解决方案 »

  1.   

    楼主如果给每个级一个特定的变量应该更容易解决问题:
    例:classid...................classkind
    A...........................kA
    A1..........................kA
    A2..........................kA
    A3..........................kA
    .                            .
    .                            .
    .                            .   
    An...........................kA
    B............................kB
    B1...........................kB
    B2...........................kB
    .                            .
    .                            .
    .                            .
    Bn...........................kB
    这样的话,删除N级就容易的多了!$Sql = "delete from Mac_Class where classkind=kA";  //同一级别的全删除了$sql="delete from Mac_Class where classkind in(select classkind from Mac_Class where Classid=A)";  //
      

  2.   

    如果是InnoDB的结构,并且有效的设置了PK/FK,那么可以设置cascade delete。
      

  3.   

    Oops, 看错了。原来是一个表里的递归删除。这样的话,可能要先构造一个树结构的栈:先将1压栈,然后找出所有以1为父的子节点,比如是1.1, 1.2,压栈;对1.1,1.2递归操作,找到1.1.1,1.1.2,1.2.1,1.2.2………………如此反复。然后再按照栈的顺序不断删除。不过,我的建议是,不必如此做,因为不但算法复杂,而且很耗时。如果我要删除分类1,那么我只要将所有以1为父分类的分类中的"parent id"设置为null或者类似-1,-999这样没有实际意义的分类即可。同时,对于分类1本身,我可以删除之,或者设置一个del_flag表示该分类已经被删除即可。这样做的缺点是,对于1.1.1,我还是能找到1.1,但是毕竟无法再从1.1回溯到1(因为1.1的parent_id==-1或者null从而阻断了回溯);而从上到下,由于1已经不再存在,将无法获得1.1,1.1.1等子分类,从而阻断了向下伸展。如果将来决定对原来的1.1,1.2重新安排一个父分类,也只要修改1.1,1.2的parent_id到一个新的数值即可。这些操作的SQL语句都相对简单。仅供参考。