Форум: "Прочее";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
Вниз"Рекурсивный" запрос 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c