Оказывается, что реляционные базы данных ужасны при обработке деревьев. Вероятно, вам лучше попробовать другой способ хранения ваших данных. Если у вас есть ваше сердце, установленное на этой схеме, у вас есть три варианта, ни один из которых не очень хорош.
Вариант 1:
Если вы знаете корень дерева и знать глубину дерева:
SELECT uid, value, parent_uid
FROM your_table level1
LEFT JOIN your_table level2 ON uid = parent_uid
ON level1.uid = level2.uid
LEFT JOIN your_table level2 ON uid = parent_uid
ON level3.uid = level3.uid
/* repeat the join until you have gone enough levels down */
WHERE uid = 7 /* or whatever the uid is */
ORDER BY parent_uid, uid
Вы можете использовать это, чтобы получить все, что, как предполагается, в дерево для этого корня и восстановить его в php. Эта опция отстой, потому что она медленная и не гибкая.
Вариант 2
Если вы знаете корень дерева, а не глубина:
<?php
$root_id = 7;
$id_list = array($root_id);
$tree = array();
while (!empty($id_list)) {
$new_list = array();
foreach ($id_list as $id) {
$query = "SELECT * FROM your_table WHERE parent_uid = '$id'";
$results = mysql_query($query);
while ($next = mysql_fetch_array($results)) {
array_push($new_list, $next['uid']);
}
// find the item in $tree and add it, also ugly
}
$id_list = $new_list;
}
echo json_encode($tree);
Несмотря быть более гибкими эта опция медленнее и уродливее.
Вариант 3:
<?php
$query = "SELECT * FROM your_table ORDER BY parent_uid";
$result = mysql_query($query);
$tree = array();
while ($next = mysql_fetch_array($result)) {
// attach the item to $tree, this is slow and/or ugly code
}
echo json_encode($tree);
?>
Этот код требует, чтобы получить всю таблицу из MySQL, плюс это своего рода медленно.
Вывод:
я не испытывал какой-либо из этих образцов кода, потому что все они сосут. Найдите другой метод хранения деревьев. SQL просто отстой для этой работы. Возможно, вы захотите сохранить его в xml или json для начала, если набор данных слишком велик, и в этом случае вам понадобится механизм хранения, предназначенный для этой задачи.
+1 для информации, хотя вы выглядите немного пессимистично. SQL Server имеет общие выражения таблицы для такого рода вещей, которые, по-видимому, не имеют аналогов в MySQL. Но, конечно, есть способы сделать это; существует множество приложений, которые требуют какой-то иерархической структуры (например, любое управляемое данными приложение с древовидным меню или карта сайта). –
Извините за пессимизм, это в основном остаточный, когда я боролся с этой проблемой. Это, безусловно, можно сделать, как показывают эти примеры, но SQL не может пересекать дерево. Это аналогично объединению n-уровня, где n неизвестно движку SQL. Все, что использует стандартный SQL, либо медленное, либо сложное, и, возможно, и то, и другое. Я просто рекомендую использовать другой подход. – regality
Я попробую второй вариант. спасибо –