Если этот вариант использования является распространенным в вашем приложении, просто сохраните корневой идентификатор (идентификатор корневого элемента дерева. Это может быть идентификатор сообщения, которому принадлежат эти комментарии). Теперь, когда вам нужно получить все дерево комментариев, вам просто нужно сделать:
SELECT * FROM comments WHERE root_id = <root_id>
или эквивалентный запрос для вашего дизайна. Если вы предоставите определения таблиц, я могу помочь вам с конкретными запросами.
Обновление:
$dbh = new PDO($dsn, $user, $password);
$sql = "SELECT A.*, GROUP_CONCAT(descendant) as descendants FROM Comments AS A INNER JOIN Paths AS B ON A.id = B.ancestor WHERE A.item = ? GROUP BY A.id";
$stmt = $dbh->prepare($sql);
$stmt->execute(array($item));
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
$adjacency_list = array(); $comments = array();
foreach($data as $row) {
$comments[$row['id']] = $row;
$descendants = explode(',', $row['descendants']);
$adjacency_list[$row['id']] = $descendants;
}
echo '<UL>';
foreach($adjacency_list[$item] as $top_level_comment) {
printTree($top_level_comment, $adjacency_list[$top_level_comment]);
}
echo '</UL>';
function printTree($node, $descendants) {
echo '<LI>'.$node;
if(sizeof($descendants) > 0) {
echo '<UL>';
foreach($descendants as $descendant) {
$d = array();
if(!empty($adjacency_list[$descendant])) $d = $adjacency_list[$descendant];
printTree($descendant, $adjacency_list[$descendant]);
}
echo '</UL>';
}
echo '</LI>';
}
Модель Nested Set Model, с другой стороны, не является хорошим решением для комментирования системы из-за большого количества вставок и обновлений. Это эффективное решение, если ваши данные редко обновляются.