привожу код построения дерева названий родителей и потомков из бд + накопительные ссылки, т.е. ссылка на родителя, потом на первое поколение, затем на второе и т.д.
<? $host = 'localhost'; $db_user = 'db_user'; $db_name = 'db_name'; $db_pass = 'db_pass'; $db_table = 'db_table'; $parent_key = 'parent_id'; // or part_parent_id $field_key_1 = 'name'; $field_key_2 = 'id'; // or part_id $field_key_3 = 'url'; $link = mysql_connect($host, $db_user, $db_pass); if (!$link) { die(mysql_error()); } else { mysql_select_db($db_name, $link) or die(mysql_error()); } function parent_childs_tree($parent_id = 0) { global $db_table, $parent_key, $field_key_1, $field_key_2; $sql = 'select * from ' . $db_table . ' where ' . $parent_key . ' = ' . $parent_id; $result = mysql_query($sql); if (mysql_num_rows($result) > 0) { echo '<ul>'; while ($row = mysql_fetch_array($result)) { // к сожалению, не удалось вывести накопительные ссылки без доп. запросов $url = array(); $id_ = $row[$field_key_2]; while ($id_ != 0) { $sql2 = 'select ' . $parent_key . ', ' . $field_key_1 . ' from ' . $db_table . ' where ' . $field_key_2 . ' = ' . $id_; $result2 = mysql_query($sql2); if (mysql_num_rows($result2) > 0) { while ($row2 = mysql_fetch_array($result2)) { $id_ = $row2[$parent_key]; $url[] = $row2[$field_key_1]; } } } $url = array_reverse($url); $url_string = ''; foreach ($url as $url_part) { $url_string .= '/' . $url_part; // /parent/child1/child2/.. } // echo '<li><a href="' . $url_string . '">' . $row[$field_key_1] . ' (id=' . $row[$field_key_2] . ', parent_id=' . $row[$parent_key] . ')</a></li>'; parent_childs_tree($row[$field_key_2]); } echo '</ul>'; } } parent_childs_tree(); // or parent_childs_tree(10) for show childs of id = 10 mysql_close($link);