если интересен подход без рекурсии
Sergey M. 07.01.2005 13:04
как-то в форуме уже
проходила ссылка, однако на данный момент она нерабочая, пожалуй автор статьи не обидится если я её сюда продублирую. Вобщем, там почти всё так-же, только поле hierarhy вычисляется несколько иным способом.
Как вывести тред форума из реляционнной БД одним запросом, не используя рекурсивный алгоритм? У сообщения должно быть четыре ида и X. Один - идентификатор форума, второй - идентификатор треда, третий - идентификатор письма, четвертый - на что отвечаем. X определяет положение в треде и идом не является.
С идентификатором форума все понятно (не будем же мы заводить по базе на форум). Теперь делаем две процедуры:
1. Написание письма. Идентификатор треда - новый, X - ноль, на что отвечаем - ноль.
2. Написание ответа на письмо. Идентификатор треда - такой же, как и у оригинала, идентификатор оригинала - в на что отвечаем, X делаем так:
X1=X оригинала.
X2=максимальный лонг / 2.
Ежели оригинал последний в треде, то так и оставляем, иначе:
Теперь смотрим, какой X у следующего письма в этом треде, если его отсортировать по X. Это X2.
Если между X1 и X2 разница в 2 или больше, то новый X = (X1+X2)/2.
Готово.
Иначе перенумеруем тред:
Проверяем, а не достигло ли количество писем предела в максимальный лонг / 2? Нет? Хорошо. :)
Делаем шаг = (MAXLONG/2)/(количество писем в треде) и с таким шагом даем письмам новые X, начиная с нуля. Как раз на все должно хватить. :) После окончания процесса - го ту снова добавлять.
Усе! Теперь можно выводить свое дерево одним запросом, без рекурсии.