Я пытаюсь понять, как отображать вложенные данные MySQL, используя php. Мне удалось отбросить все «листовые узлы», но потом я застрял. Мне нужно отобразить целое дерево и все его элементы. Вот таблица
category_id, name, lft, rgt 1 Saws 1 12 2 Chainsaws 2 7 3 Red 3 4 4 Yellow 5 6 5 Circular saws 8 9 6 Other saws 10 11
Вот код:
$query = 'SELECT node.name, node.lft, node.rgt FROM item_cats AS node, item_cats AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt AND parent.name = "' . SAWS . '" ORDER BY node.lft'; $result = mysql_query($query, $db) or die (mysql_error($db)); while ($row = mysql_fetch_assoc($result)) { if ($row['rgt'] == $row['lft']+1) { echo '==>'; } echo $row['lft']; echo $row['name']; echo $row['rgt']; echo '<br />'; echo '<br />'; }
И это то, что я получаю:
1Saws12 2Chainsaws7 ==>3Red4 ==>5Yellow6 ==>8Circular saws9 ==>10Other saws11
Основываясь на ссылке, которую показал мне Стю, в этом уроке показан этот запрос для определения глубины:
SELECT node.name, (COUNT(parent.name) - 1) AS depth FROM nested_category AS node, nested_category AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt GROUP BY node.name ORDER BY node.lft
Итак, что-то вроде этого должно работать:
<?PHP $query = 'SELECT node.name, (COUNT(parent.name) - 1) AS depth FROM nested_category AS node, nested_category AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt GROUP BY node.name ORDER BY node.lft'; $result = mysql_query($query, $db) or die (mysql_error($db)); while ($row = mysql_fetch_assoc($result)) { for ($i = 0; $i < $row['depth']; $i++) { echo '==>'; } echo $row['name']; echo '<br />'; echo '<br />'; } ?>
Это должно выводить:
Saws ==>Chainsaws ==>==>Red ==>==>Yellow ==>Circular Saws ==>Other Saws
<?PHP $query = ' select if( count(a.name) - 1 = 0, a.name, concat(repeat(' ', count(a.name) - 2), '+--', b.name) )name from nested_category b, nested_category a where node.lft between a.lft and a.rgt group by b.name order by b.lft'; $result = mysql_query($query, $db) or die (mysql_error($db)); while ($row = mysql_fetch_assoc($result)) echo "{$row['name']}<br>"; ?>
Должен сделать так:
Saws +--Chainsaws +--Red +--Yellow +--Circular Saws +--Other Saws