Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.011 c
15-1139576650
denis24
2006-02-10 16:04
2006.03.05
компонент типа dateedit


11-1120726093
chum
2005-07-07 12:48
2006.03.05
KOL DB и обработка ошибок


1-1138915522
guitarist
2006-02-03 00:25
2006.03.05
заполнение форм в IE


5-1126106842
TStas
2005-09-07 19:27
2006.03.05
Редактор нестандартного свойсва


15-1139484028
jack128
2006-02-09 14:20
2006.03.05
RTTI для public методов? Это возможно ;-)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский