Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бесконечная вложенность. MySQL. 
:(
    Опции темы
IZ@TOP
Дата 3.6.2004, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



Задача следующая: необходимо создать дерево с любым количеством вложений. Таблица выглядит так:
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?


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
AntonSaburov
Дата 3.6.2004, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



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

Я помню был пример для MS SQL, но там была сохраненная процедура и использовались кое-какие штучки именно MS.
PM MAIL WWW ICQ   Вверх
Nobody
Дата 3.6.2004, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: нет
Всего: 16



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


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
arial
Дата 3.6.2004, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: нет
Всего: 7



Вот пример из книги 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


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


--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
Nobody
Дата 3.6.2004, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: нет
Всего: 16



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

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


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
boevik
Дата 3.6.2004, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 2
Всего: 35



Цитата
Код
SELECT TABLE1.NAME, TABLE2.NAME
  FROM TABLE TABLE1, TABLE TABLE2
  WHERE TABLE1.MNGR_ID = TABLE2.ID


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

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

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


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
IZ@TOP
Дата 4.6.2004, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



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

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


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
nicka
Дата 4.6.2004, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 11.6.2003

Репутация: нет
Всего: 1



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

PM MAIL   Вверх
IZ@TOP
Дата 4.6.2004, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: нет
Всего: 73



nicka
К сожалению речь не об Оракле... sad.gif


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.