parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

если интересен подход без рекурсии

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, начиная с нуля. Как раз на все должно хватить. :) После окончания процесса - го ту снова добавлять.

Усе! Теперь можно выводить свое дерево одним запросом, без рекурсии.