Autor Zpráva
jirka11
Profil *
Pro výpis dat pomocí traverzování kolem stromu používám tento algoritmus od Jakuba Vrány:

<?php
$result = mysql_query("SELECT * FROM strom ORDER BY lft");
$hloubka = -1;
while ($row = mysql_fetch_assoc($result)) {
    if ($hloubka < $row["hloubka"]) {
        echo "<ul>";
    } else {
        echo str_repeat("</li></ul>", $hloubka - $row["hloubka"]) . "</li>";
    }
    echo "<li>\n" . htmlspecialchars($row["nadpis"]);
    $hloubka = $row["hloubka"];
}
echo str_repeat("</li></ul>", $hloubka + 1) . "\n";
mysql_free_result($result);
?>

Vše funguje krásně, ale nějak z jeho článku nechápu, jak vypsat jen část stromu - od určitého uzlu dál. Jak tento algoritmus upravit, ideálně tak, abych určil ID položky od které se má vypsat strom? Díky.
juriad_
Profil *
SELECT s.* FROM strom s
JOIN strom r ON n.id = 123
WHERE s.lft >= r.lft AND s.lft <= r.rght
ORDER BY s.lft

Chceš uzly s takové, že uzel r je jejich předek (jsou v rozsahu jeho lft a rght):
r.lft <= s.lft <= r.rght
jirka11
Profil *
Takhle mi to hodí chybu, že neexistuje sloupec n.id, pokud smáznu n. tak hodí error že id je nejednoznačné.


Hm, odpoledne už jsem si fakt seděl na vedení. Takhle to funguje:
$lftrgt  = mysql_fetch_assoc(mysql_query("SELECT lft, rgt FROM strom WHERE id='$id'"));
$result = mysql_query("SELECT * FROM strom WHERE rgt <= $lftrgt[rgt] AND lft >= $lftrgt[lft] ORDER BY lft");
Tudíž vyřešeno, díky za pomoc :-)

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: