Rekursion

maceo

Mitglied
Hallo zusammen,

sitze grad vor einer MySQL-Datenbank und versuch Verzeichnisse (Einträge) rekursiv zu löschen. Leider komm ich im Moment gar nicht voran - liegt wohl daran, dass ich noch nie viel mit Rekursion zu tun hatte... Hat jemand von euch einen Ansatz, wie ich folgende Einträge rekursiv aus der DB löschen kann?

Die gekennzeichnete Zeile ist hierbei der zu löschende Ordner - alle anderen darunter sollen mit weg...

Vielen Dank schon einmal für eure Tipps,
maceo

Code:
folder_id | folder_nr | main_folder_nr | isparent
----------+-----------+----------------+----------
     4971 |      4971 |           4968 |        1
     4972 |      4972 |           4971 |        0
     4973 |      4973 |              0 |        1
     4974 |      4974 |           4973 |        1    <--
     4976 |      4976 |           4974 |        1
     4977 |      4977 |           4976 |        1
     4978 |      4978 |           4977 |        0
     4981 |      4981 |           4974 |        0
     4982 |      4982 |           4977 |        0
 
Zuletzt bearbeitet:
Ginge es darum rekursiv aus dem Dateisystem zu löschen wäre das was anderes nur asu der Datenbank werde ich da nicht wirklich schlau.
Wie sieht denn die Struktur aus?

Ansonsten wenn der Pfad zum zu löschenden Order dieser wäre:
/tmp/ab_hier

dann sähe dein Statement einfach so aus
DELETE * FROM `tabelle` WHERE dirname LIKE "/tmp/ab_hier%"
 
Geht leider nicht, da die id's autoinc sind und du mehrere zweige hast.
Die Sache ist etwas verzwickter... Hier einmal eine andere Ansicht. Die
Zahlen sind jeweils die "folder_nr", dahinter steht quasi, ob noch ein
weiterer/tieferer zweig folgt (siehe Tabelle oben):

Code:
(...)
   |
   +----4974 (1)
   |       |
   |       +----4981 (0)
   |       |
   |       +----4976 (1)
   |       |      |
   |       |      +----4977 (1)
   |       |             |
   |       |             +----4978 (0)
   |       |             |
   |       |             +----4982 (0)
   |       |
   |       +----(...)
   |
   +----(...)
   |
(...)
 
Hab es jetzt doch hin bekommen...

Hier einmal der Code (wen es interessiert).
Ich rufe meine "Rekursions-Funktion" auf und übergebe die "oberste" id:
PHP:
$ret = $this->folder_get_recursive($folder_id);

PHP:
function folder_get_recursive($id)
{
  if ( $this->folder_get($id,1) )
  {
    $this->ret_a[] = $id;
    $ret = $this->folder_get($id);
    for ( $i=0; $i<$ret["rows"]; $i++ )
    {
      $this->folder_get_recursive($ret["row$i"]["folder_id"]);
    }
  }
  else
  {
    $this->ret_a[] = $id;
  }
  return $this->ret_a;
} // folder_get_recursive

Hier zieh ich mir das Nötigste (ist vielleicht nicht so schön):
PHP:
function folder_get($id, $choice=0)
{
  if ( $choice )
  {
    $sql = "SELECT isparent ";
    $sql.= "FROM folder ";
    $sql.= "WHERE folder_id=".$id." ";
    $ret = $this->db_select($sql);
    $ret = $ret[row0]["isparent"];
  }
  else
  {
    $sql = "SELECT folder_id ";
    $sql.= "FROM folder ";
    $sql.= "WHERE main_folder_nr=".$id." ";
    $ret = $this->db_select($sql);
  }
  return $ret;
} // function folder_get

Das Ganze dann später in einer Schleife durch's DELETE jagen - fertig!
(Ich lösche dann anhand der id's)
 
Zurück