Autor Zpráva
seith
Profil *
Ahoj, mám stromovou strukturu v tabulce (sloupce id a parent) a potřebuji smazat celou větev od určitého prvku. Jak by jste řešili tento problém co nejefektivněji?
seith
Profil *
Omlouvám se za špatný titulek, původně jsem psal jiný příspěvek, prosím opravte.
okolojdouci
Profil *
Rekurzivně bych udělal toto:
1. vytáhneš všechna ID potomků do stringu
2. smažeš jejich rodiče
3. Jestliže string není prázdný, jdeš na 1.
seith
Profil *
Nevím jestli jsme se pochopili, mám na mysli databázi prvků, kde v parent je uložené id nadřazeného prvku. Když smažu určitý prvek, potřebuji smazat i všechny jeho potomky (může to být více úrovní).

Řešil jsem to tak, že jsem smazal určitý prvek a poté hledám a mažu prvky bez rodiče, dokud nějaké existují.

Něco na způsob:
DELETE FROM items WHERE parent NOT IN (SELECT id FROM items) AND id != 0

jenže tento příkaz nefunguje (MySQL nepodporuje subquery v UPDATE a DELETE)

Napadá vás nějaké řešení?
okolojdouci
Profil *
Asi jsme to nenapsal nejlíp. Myslel jsem to takto (neotestováno):

$ids = $_POST['delmenuitem'];

while (!empty($ids)) {
  $qry ="DELETE FROM menu WHERE ID IN (".$ids."0)";

  $qry ="SELECT ID FROM menu WHERE parentID =".$ids;
  $res=mysql_query($qry); 
  $radku=mysql_num_rows($res);

  if ($radku>0)
  {
    $ids= "";
    while ($zaznam=MySQL_Fetch_Array($res)):
      $ids.=$zaznam["ID"].",";
    endwhile;
  };
};
TomášK
Profil
seith:
Cizí klíč a ON DELETE CASCADE, viz
mysql> create table items ( id INT PRIMARY KEY, parent_id INT) ;
Query OK, 0 rows affected (0.18 sec)

mysql> alter table items add foreign key fk(parent_id) references items(id) on delete cascade;
Query OK, 0 rows affected (0.47 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into items values (1, NULL), (2, 1), (3, 2), (4, NULL);
Query OK, 4 rows affected (0.07 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from items;
+----+-----------+
| id | parent_id |
+----+-----------+
|  1 |      NULL |
|  4 |      NULL |
|  2 |         1 |
|  3 |         2 |
+----+-----------+
4 rows in set (0.00 sec)

mysql> delete from items where id = 1;
Query OK, 1 row affected (0.14 sec)

mysql> select * from items;
+----+-----------+
| id | parent_id |
+----+-----------+
|  4 |      NULL |
+----+-----------+
1 row in set (0.00 sec)

seith
Profil *
TomášK:
Výborně, díky! Jinak jsi mi vyřešil i další problém, řešením je ON UPDATE.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0