Autor Zpráva
pastikar
Profil *
Zdravím,

potřebuji poradit - potřebuji získat všechny "nadřazené referenty" vybraného uživatele, tedy např. vyberu uživatele 9 a ten má "referenta" uživatele s ID 5, a ten má zase referenta s ID 4, ten má zase referenta s ID 1..a potřebuji prostě získat z databáze všechny nadřazené ID..


userid jmeno referent
----------------------------------------------
1 adolf 0
2 karel 0
3 demeter 1
4 lojza 1
5 paja 4
6 vajcak 4
7 tadeas 5
8 jirka 5
9 kozel 5
10 ivan 9
11 alex 11
12 koza 0


ziskej_uzivatele od KOZEL(9)
----------------------------------------------

Moderátor Majkl578: Přesunuto z Kategorie PHP.
Majkl578
Profil
Pro ukládání a manipulaci s takovýmito strukturami se používají pokročilejší techniky, například Traverzování kolem stromu nebo Closure Tree.
juriad
Profil
S tvou strukturou se ti to nepovede jedním dotazem. Lze to jen pokud
1) tvoje databáze umí hierarchické selecty (mysql je neumí) nebo
2) hloubka je omezená konstantou (například všichni uživatelé jsou nejhlouběji 5)

Jiné reprezentace stromů to umožňují, viz http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back od strany 49.
pastikar
Profil *
No mám to teď takto, ovšem potřebuji dostat pouze jednoho uživatele ( např. ID 9 ) , a nějak mě nenapadá jak...


$parent_refs = array();
$child_list = array();
$result = mysql_query("SELECT userid, referent, jmeno FROM users ORDER BY jmeno");
while($data = @mysql_fetch_assoc($result)) {

$thisitem = &$parent_refs[ $data['id'] ];

$thisitem['parent_id'] = $data['refent'];
$thisitem['title']     = $data['jmeno'];
$thisitem['id']        = $data['userid'];

if ($data['parent_id'] == $thisitem) {
$child_list[ $data['id'] ] = &$thisitem;
} else {
$parent_refs[ $data['parent_id'] ][ $data['id'] ] = &$thisitem;
}

}

print_r($parent_refs); // vypise vsechny
Kcko
Profil
Takto?

$q = mysql_query("SELECT * FROM users ORDER BY jmeno");


$tree = array();
while ($row = mysql_fetch_array($q))
{
    $tree['parent'][$row["referent"]][] = $row;
    $tree['child'][$row['userid']] = $row['referent'];
}


function getAllParents($childId = 0, $tree)
{
    $nodes = array();
    while (isset($tree['child'][$childId]) > 0)
    {
        $nodes[] = $childId;

        $childId = $tree['child'][$childId];
    }

    return $nodes;
}



print_r(getAllParents(9, $tree));

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: