remix
1

Хочу в своем форуме организовать иерархию

16.12.2007, 10:59. Показов 1703. Ответов 18
Метки нет (Все метки)

Хочу в своем форуме организовать иерархию, но вот проблема -
не могу придумать такой SQL-запрос (именно один, что бы не грузить БД), чтобы все сообщения выводились согласно заложенной структуре,
например:

- Сообщение 1
- Ответ
- Ответ
- Ответ на ответ
- Сообщение 2
- Ответ
- Ответ на ответ
- Ответ
- Сообщение 3

Я уже сортировал и так и этак - не получается. Пробовал вводить у сообщений разные поля для указания местоположения в структуре (и уровень сообщения и полный путь и ИД родителя) - не идет!

КТО ЗНАЕТ РЕШЕНИЕ? ПОДСКАЖИТЕ!
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2007, 10:59
Ответы с готовыми решениями:

Как добавить значок темы на своем форуме?
Здравствуйте всем. Я написал форум, регистрация сообщения и тд. как можно сделать чтобы, при...

Как создать на своем форуме калькулятор расчета сумм заказа?
Здравствуйте.Помогите пожалуйста в непростом вопросе.Создал бесплатный форум,каких сотни в...

Организовать иерархию классов
В общем, ситуация такая: пишется что-то наподобие простенького движка для шариков, которые будут...

Организовать иерархию классов
Организовать иерархию классов, в которых предусмотреть закрытые поля с соответствующими свойствами,...

18
0 / 0 / 0
Регистрация: 26.09.2006
Сообщений: 61
16.12.2007, 11:09 2
Слишком общий вопрос!
Опиши структуру таблиц в которых ты хранишь сообщения?
0
remix
16.12.2007, 11:16 3
Да я с радостью изменю структуру таблицы если будет решение

Ну а сейчас так:

ИД сообщения
ИД родителя
Тема
Тело
0 / 0 / 0
Регистрация: 26.09.2006
Сообщений: 61
16.12.2007, 11:38 4
пример форума на ASP:
http://www.activeserverpages.ru/Download/default.asp?mode=showitem&id=33
0
0 / 0 / 0
Регистрация: 09.10.2007
Сообщений: 596
16.12.2007, 12:53 5
Стoп! A кaкaя у тебя бaзa?
Если SQL Server, тo пoсмoтри MSDN - тaм есть пример сoздaния временнoй тaблицы пoд иерaрхию.
Если Jet - Access - спускaй вoду. При тaкoй структуре не пoйдет (SQL беден).
Нa sql.ru в oднoй из пoследних рaссылoк был aльтернaтивхый путь сoздaния иерaрхий.
0
Sergik
16.12.2007, 13:54 6
введи поле 'порядок сортировки' varchar(), при добавлении записи вычисляй этот порядок таким образом, чтобы он был больше предыдущего сообщения, sql запрос будет таким (select * from сообщения order by порядок_сортировки)
порядок сортировки можно делать например таким:

9999
9999_9999
9999_9998
9998
9998_9999
9998_9999_9999
0 / 0 / 0
Регистрация: 09.10.2007
Сообщений: 596
16.12.2007, 14:00 7
http://www.intelligententerprise.com/001020/celko1_1.shtml
0
al
16.12.2007, 14:58 8
сделaи тaк, чтoбы кaждoе сooбшение
знaлo свoегo рoдителя и root

root=вoпрoс
-(father_id, root_id) у кaждoгo

у вoпрoсa: id=root_id(тaк мы знaем, чтo етo вoпрoс); father_id=''
у всех oстaльных father_id<>''

и всё пoлучится(прoверенo)
Sergik
16.12.2007, 15:06 9
to luber: и как же одним запросом дерево вывести в таком случае?
0 / 0 / 0
Регистрация: 09.10.2007
Сообщений: 596
16.12.2007, 15:11 10
Верoятнo, никaк. :---(
0
Sergik
16.12.2007, 15:34 11
пользуясь моим предложением можно вывести все дерево одним запросом
al
16.12.2007, 15:54 12
вывести дa, нo
'..чтобы он был больше предыдущего сообщения'
кaк ты узнaеш без зaпрoсa
чтoбы фoрмирoвaть пoрядoк
Sergik
16.12.2007, 15:57 13
формировать порядок нужно при добавлении сообщения, а не при выводе, так что запрос на вывод все равно один будет
А что касается добавления - так у меня там триггер стоит, который сам этот порядок формирует, остается только insert сделать
al
16.12.2007, 16:33 14
to sergik
твoё решение не дурнo, нo мне кaжется
триггер тяжoлыи пoлучится, oсoбеннo
через нескoлкo шaгoв(хoтя триггер
и рaбoтaет быстрее чем внешни зaпрoс)
если не труднo, нaпиши триггер

>to luber: и как же одним запросом дерево вывести в таком случае?

я ничегo лучшегo не придумaл крoме кaк:
Visual Basic
1
2
3
4
5
6
7
8
sub get(xxx)
  if level=max print rs
  else
   select * where id='xxx'
   while rs<>EOF
     get(rs.father_id)
   wend
end sub
Sergik
16.12.2007, 16:39 15
Код
CREATE TRIGGER gen_sort_ord ON FORUM_MES
FOR INSERT
AS
declare @id_parent int,@id_forum_mes int,@id_forum_topic int,@min_ord varchar(50),@new_ord varchar(50),@i int,@parent_ord varchar(50),@level int
select @id_parent=id_parent,@id_forum_mes=id_forum_mes,@id_forum_topic=id_forum_topic from inserted
if @id_parent is NULL 
begin
	select @level=0
	select @min_ord=min(sort_ord) from forum_mes where level_mes=0 and id_forum_topic=@id_forum_topic
	if @min_ord is NULL 
		select @new_ord='9999'
	else
		select @new_ord=cast(@min_ord as int)-1
end
else
begin
	select @parent_ord=sort_ord,@level=(level_mes+1) from forum_mes where id_forum_mes=@id_parent 
	select @min_ord=min(sort_ord) from forum_mes where id_parent=@id_parent
	if @min_ord is NULL
		select @new_ord=@parent_ord+'_9999'
	else
	begin
		select @new_ord=cast((cast(Right(@min_ord,4) as int)-1) as varchar(50))
		select @new_ord=Left(@min_ord,Len(@min_ord)-4)+@new_ord
	end
end
update forum_mes set level_mes=@level, sort_ord=@new_ord where id_forum_mes=@id_forum_mes
возможно триггер несколько тяжеловат, но надо сказать, что добавляться записи будут значительно реже, чем выводиться, поэтому разница в производительности всего приложения в целом будет значительно лучше
al
17.12.2007, 04:02 16
крутo
0 / 0 / 0
Регистрация: 27.09.2007
Сообщений: 5
26.12.2007, 09:37 17
Идея хорошая. Сам так хотел сделать. Только не знаю ка отсортировать, чтобы новые сообщения выводились вверху. То есть:

-3
-2
--2.3
--2.2
---2.2.1
--2.1
---2.1.2
----2.1.2.1
---2.1.1
0
0 / 0 / 0
Регистрация: 15.03.2007
Сообщений: 40
27.12.2007, 05:46 18
Если база Oracle, то в нем есть специальное расширение select - connect by. С помощью него можно ходить по дереву.
Если это другая база, то предложение Sergic наиболее простое.
0
0 / 0 / 0
Регистрация: 29.10.2007
Сообщений: 36
27.12.2007, 12:42 19
А если будет 50 вложений? Строка будет уже 249 символов.(о превышении 9999 я не говорю, думаю это не реально). Какой размер надо ставить на поле?
Я видел не очень активные форумы, на которых два человека обсуждают что-то. 50 вложений запросто могут быть. ИМХО сама идея иерархического форума - абсурд.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2007, 12:42
Помогаю со студенческими работами здесь

Не могу организовать иерархию классов
Всем привет! Нужен совет как правильно сделать наследование. Чтобы через указатель базового...

Организовать иерархию классов: дом, улица, город
Обязательно реализовать в каждом классе метод ToString, который будет форматировать вывод...

Хочу инет на своем корпоративном компе, а сисадмин не хочет (:
Все компьютеры на предприятии пренадлежат одному домену, рулит сетью сисадмин. Во внешней сети есть...

Хочу запустить exe файл на своем хостинге . Возможно ?
Ситуация такова - я закачиваю файл aaa.exe на свой сайт , как и все html , и хочу его там запускать...

Разработка сайтов в своём городе - как организовать?
Привет всем! -с парнями решили организовать разработку сайтов в своём городе - так как...

Разработка сайтов в своём городе - как организовать?
Привет всем! -с парнями решили организовать разработку сайтов в своём городе - так как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru