Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

"Рекурсивный" запрос SQL   Найти похожие ветки 

 
vidiv ©   (2006-02-11 21:46) [0]

Пусть есть таблица с тремя полями `id`, `parent` и `text`
`id`, `parent` - числовые, `text` - любое обсолютно:
CREATE TABLE `test` (
 `id` int(11) NOT NULL auto_increment,
 `parent` int(11) NOT NULL default "0",
 `text` varchar(255) NOT NULL default "",
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


Таблица нужна для создания некой древовидной структуры. Каждая строка таблицы - элемент дерева. Если `parent`=0, то елемент является корнем дерева. Каждый елемент (за исключением корней) является непосредственным ответвлением некого другого (связь через `parent` и `id`). Пример:

INSERT INTO `test` (`id`, `parent`, `text`) VALUES
(1, 0, "foo"),
(2, 1, "foo one"),
(3, 2, "foo two"),
(4, 1, "bar one"),
(5, 3, "foo three");


Для дерева:

foo (1)
  foo one (2)
     foo two (3)
        foo three (5)
  bar one (4)


Можно ли имея `id` некого элемента одним запросом получить все элементы на пути от данного элемента до корня? Например по id=4, запрос должен возвратить элементы 4 и 1,
по запросу id=2: 2, 1,
по запросу id=3: 3, 2, 1,
по запросу id=5: 5, 3, 2, 1.


 
Desdechado ©   (2006-02-11 21:58) [1]

деревья можно хранить по-разному
например, на Королевстве есть статейка с другим способом
способ хранения лучше выбирать, ориентируясь на типовые запросы к этому дереву

да, в таком виде однм запросом, имхо, не получится
хотя в оракле можно через CONNECT BY


 
vidiv ©   (2006-02-11 22:09) [2]


> Desdechado ©   (11.02.06 21:58) [1]
> деревья можно хранить по-разному

Использую для древовидного форума. помимо этих полей - есть вспомогательные (`thread` - номер темы, `order` - порядковый номер елемента в построенном дереве сверху вниз и `depth` отступ слева для элемента). Для моего примера:

                      `order`  `depth`
foo (1)                   0        0
 foo one (2)             1        1
   foo two (3)           2        2
     foo three (5)       3        3
 bar one (4)             4        1

благодаря чему достаточно просто получить как всю тему, так и ее чать из базы. также просто осуществляется добавление/удаление елементов.

Возникла задача реализовать подписку на рассылку новых сообщений. С помощью искомого запроса я хочу выяснить подписан ли пользователь на данную ветку (путь) или нет. Т.е. узнать какие темы могут быть помечены для подписки.

Надеюсь достаточно понятно объяснил (у меня с этим трудности)...


 
vidiv ©   (2006-02-11 22:11) [3]


> .е. узнать какие темы могут быть помечены для подписки

точнее не темы, а сообщения.


 
xayam ©   (2006-02-11 22:15) [4]

http://www.osp.ru/os/2004/02/062.htm


 
vidiv ©   (2006-02-11 22:26) [5]


> http://www.osp.ru/os/2004/02/062.htm

Предлагаемая тут структура "M-арных деревьев" достаточно стандартная, и недостаточно удобная...


> Desdechado ©   (11.02.06 21:58) [1]
> например, на Королевстве есть статейка с другим способом

А как ее найти?


 
xayam ©   (2006-02-11 22:27) [6]

А вообще XML для этого есть! Чем не дерево?


 
vidiv ©   (2006-02-11 22:29) [7]


> xayam ©   (11.02.06 22:27) [6]

MySQL удобнее для моей задачи.


 
xayam ©   (2006-02-11 22:32) [8]


> MySQL удобнее для моей задачи

А код на чем, на PHP?


 
vidiv ©   (2006-02-11 22:33) [9]


> А код на чем, на PHP?

Да.


 
xayam ©   (2006-02-11 22:34) [10]

http://phpclub.ru/detail/article/db_tree


 
xayam ©   (2006-02-11 22:36) [11]

http://phpclub.ru/detail/article/myXTree#links


 
vidiv ©   (2006-02-11 22:53) [12]


> xayam ©   (11.02.06 22:34) [10]
> http://phpclub.ru/detail/article/db_tree
>
> xayam ©   (11.02.06 22:36) [11]
> http://phpclub.ru/detail/article/myXTree#links

Я не использую сторонних классов, а вот идея вложенных множеств - мне очень понравилась... спасибо!


 
vidiv ©   (2006-02-11 23:14) [13]

Вот теперь думаю как свое преобразовать в оное.



Страницы: 1 вся ветка

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.04 c
1-1138985411
Толян
2006-02-03 19:50
2006.03.05
дил-ап


1-1138557975
Alik7107
2006-01-29 21:06
2006.03.05
Сдвиг image вправо в TComboBoxEx


2-1140026301
Корешь
2006-02-15 20:58
2006.03.05
Массив из записей как с ним работать?


15-1139565712
Koala
2006-02-10 13:01
2006.03.05
Планшет? какой выбрать....?


2-1140250059
Id
2006-02-18 11:07
2006.03.05
Печать в Excel-e