Autor | Zpráva | ||
---|---|---|---|
seith Profil * |
#1 · Zasláno: 11. 6. 2011, 17:32:24
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 * |
#2 · Zasláno: 11. 6. 2011, 17:43:50
Omlouvám se za špatný titulek, původně jsem psal jiný příspěvek, prosím opravte.
|
||
okolojdouci Profil * |
#3 · Zasláno: 11. 6. 2011, 17:50:53
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 * |
#4 · Zasláno: 11. 6. 2011, 18:04:19
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 * |
#5 · Zasláno: 11. 6. 2011, 18:32:17
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 |
#6 · Zasláno: 11. 6. 2011, 19:15:59
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 * |
#7 · Zasláno: 11. 6. 2011, 20:02:40
TomášK:
Výborně, díky! Jinak jsi mi vyřešil i další problém, řešením je ON UPDATE. |
||
Časová prodleva: 13 let
|
0