Autor Zpráva
Pan X
Profil
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
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
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?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0