Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Бесконечная вложенность.


Автор: IZ@TOP 3.6.2004, 16:42
Задача следующая: необходимо создать дерево с любым количеством вложений. Таблица выглядит так:
SQL
CREATE TABLE ParentTable (
    id int(11) not null auto_increment,
    name varchar(40) not null,
    parentid int(11) not null default 0,
);

Допустим есть некое количество записей:
Код
+--------+------------+----------------+
|    id    |    name    |    parentid    |
|    1     |   Name1   |          0         |
|    2     |   Name2   |          1         |
|    3     |   Name3   |          2         |
|    4     |   Name4   |          3         |
|    5     |   Name5   |          4         |
|    6     |   Name6   |          5         |
|    7     |   Name7   |          6         |
|    8     |   Name8   |          7         |
|    9     |   Name9   |          8         |
|    10   |   Name10 |          9         |
|    11   |   Name11 |          10       |
+--------+------------+----------------+

Так вот, как выбрать все записи по ссылке parentid пока в нем не встретится 0?

Автор: AntonSaburov 3.6.2004, 18:02
Что-то мне подсказывает, что запросом ты не обойдешься. И MySQL такую рекурсию просто не потянет. Надо делать это на клиенте, что мало интересно. Но IMHO по-другому не получится.

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

Автор: Nobody 3.6.2004, 18:52
В MySQL одним запросом никак. На любой базе, где есть хранимые процедуры, делается в два счёта.

Автор: arial 3.6.2004, 19:55
Вот пример из книги SQL за 24 часа:

Цитата
ID  NAME  MNGR_ID
-------------------------
1  JOHN      0
2  MARY      1
3  STEVE    1
4  JACK      2
5  SUE        2


И запрос:

Код
SELECT TABLE1.NAME, TABLE2.NAME
   FROM TABLE TABLE1, TABLE TABLE2
   WHERE TABLE1.MNGR_ID = TABLE2.ID


Наводит на размышление. ;)

Автор: Nobody 3.6.2004, 22:45
arial
Хмм... Остроумно smile.gif Я о таком даже и не подумал. Правда при таком раскладе корневой манагер не выберется.

Правда таким образом можно выбирать только дерево целиком. Отдельную ветку выбрать не получится.

Автор: boevik 3.6.2004, 22:53
Цитата
Код
SELECT TABLE1.NAME, TABLE2.NAME
  FROM TABLE TABLE1, TABLE TABLE2
  WHERE TABLE1.MNGR_ID = TABLE2.ID


Где в этом запросе построение дерева?
Просто выборка пар имен parent и его child names.

Эту проблему надо решать рекурсией из проги с выбором сыновей определенного родителя.
И погружаться дальше.

Если кого заинтересует, есть пример на VB6

Автор: IZ@TOP 4.6.2004, 11:02
С рекурсией я и на РНР сам напишу. А вот интересно как у этого форума это работает? Тут ведь насколько я знаю тоже вложенность поддерживается?!

PS А если делать из проги, не скажется ли это на скорости, особенно если это делается для www....?

Автор: nicka 4.6.2004, 15:46
В Oracle например следующий запрос очень удобненько выбирает всю ветку
Код
SELECT  LPAD (' ', 2 * (LEVEL-1)), *
     FROM tbl
START WITH MASTERID IS NULL
CONNECT BY PRIOR ID = MASTERID

Автор: IZ@TOP 4.6.2004, 20:12
nicka
К сожалению речь не об Оракле... sad.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)