Autor | Zpráva | ||
---|---|---|---|
Pan X Profil |
#1 · Zasláno: 21. 7. 2012, 15:10:09
Zdravím,
mám problém se stromovou strukturou dat v databázi Mám tabulku: http://2i.cz/c699a78d5e A strom vypadá takto: http://2i.cz/93ccf2d80b S výpis a upravováním, nemám problémy, ale nedaří se my vymyslet způsob jak data smazat i se všemi potomky. Pokud bych smazal řádek s id_category 5 (Auta) tak bych následně potřeboval automaticky vymazat i id_category 7, 8, 9, 10, 11 Mohl by prosím někdo poradit jak by měl script vypadat nebo jak na to jít? Nedaří se mi vůbec přijít na to jak ty data jednoduše mazat |
||
Tori Profil |
#2 · Zasláno: 21. 7. 2012, 15:32:50
Koukněte na článek Metody ukládání stromových dat v relačních databázích, část "Traverzování okolo stromu", lépe by se s takovou strukturou pracovalo.
Pokud máte neomezený počet podúrovní, dá se to řešit cyklem (1 dotaz pro každou úroveň + jeden navíc pro smazání): - mám ID uzlu, tedy požadované (pod)kategorie. Uložím ho do seznamu ID ke smazání. - najdu ID všech podřízených kategorií - pokud má nějaké podkategorie, uložím si jejich ID do seznamu - vrátím se na řádek 2, místo parentID = $id použiju parentId IN (...ID podkategorií...) - konec cyklu. Smažu všechny řádky, jejichž ID mám uložena v seznamu Pro známý max.počet úrovní by šlo nalézt řádky ke smazání asi pomocí UNION (jeden SELECT pro každou úroveň). |
||
Pan X Profil |
#3 · Zasláno: 21. 7. 2012, 16:01:32
Na traverzování jsem koukal, jen mi to přišlo zbytečně komplikované pro jednoduchý seznam kategorií
|
||
Kcko Profil |
Pan X:
Rekurzivně. Pokud to máte uloženo v nějakém poli tak projít jinak pomocí SQL dotazů - opět rekurzivně. Dostat se od rodiče ke všem dětem. Já takhle mažu stromovou diskusi... jen na ukázku function forum_showChildsUnderPost($post_id, $posts_in_topic, $childs = array()) { if ($posts_in_topic[$post_id]) { foreach ($posts_in_topic[$post_id] as $id) { $childs[] = $id; if (isset($posts_in_topic[$id])) { $childs = forum_showChildsUnderPost($id, $posts_in_topic, $childs); } } } return $childs; } a $post_in_topic je výsledek této funkce function forum_getTreePostsByTopic($topic_id = 0) { $sql = DB::query("SELECT id, parent FROM `forum_posts` WHERE topic_id = $topic_id"); $posts = array(); while($r = DB::fetch($sql)) { $posts[$r['parent']][] = $r['id']; } return $posts; } Z toho by to mohlo být pochopitelné ne? |
||
Časová prodleva: 12 let
|
0