|
|
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
Добрый день уважаемый all. есть таблица id|pod_id|name 2 | 1 | Литература 1 | null | Главная 3 | 2 | Остров сокровищь .... тут pod_id внешинй ключ ссылающийся на первичный ключ id Мне надо, сделать древовидный запрос, начиная, например, с id=3 , что бы получилось: Остров сокровищь Литература Главная В навигации это будет выглядеть как: Главная - Литература - Остров сокровищь Сам работал всегда с Oracle, там есть функции решающий данную задачю connect by, start with. Возможно ли решить данную задачю средства Mysql? Заранее благодарен за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2005, 11:32:27 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
Николай aka MotodorOracle, там есть функции решающий данную задачю connect by, start with. Возможно ли решить данную задачю средства Mysql?К сожалению в MySQL'е пока что нет аналогичных средств для работы с иерархическими структурами данных. На официальном сайте MySQL видел, что это планируется в какой-то 5-ой версии СУБД. Деревья в поддерживающих стандарты SQL базах данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2005, 12:37:24 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
http://forum.dklab.ru/php/heap/empty_15.html посмотри, до чего я дошел... сейчас в реальности структура немного изменилась, но смысл остался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2005, 14:45:05 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
Николай aka Motodor Сам работал всегда с Oracle, там есть функции решающий данную задачю connect by, start with. Возможно ли решить данную задачю средства Mysql? Заранее благодарен за помощь! Сегодня прислали с рассылкой Достижения MySQL по этому поводу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2005, 12:35:59 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
Спасибо за ссылки, сейчас почитаю ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2005, 12:54:30 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
AstronСегодня прислали с рассылкой Достижения MySQL по этому поводу Да только они не уточняют, что при построении дерева ("Retrieving a Full Tree") для выполнения этой операции кол-во LEFT JOIN прямопропорционально кол-ву "уровней вложенности" - 1. Другими словами, если захочется добавить нового потомка в дерево, "уровень вложенности" которого будет на единицу больше "уровней вложенности" остальных узлов, то придется "ручками" еще дописывать одно LEFT JOIN. ;) P.S. Хорошо конечно, когда есть хоть что-то, но имхо MySQL уже пора делать поддержку для работы с иерархическими структурами данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2005, 13:06:51 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
Berkut Да только они не уточняют, что при построении дерева ("Retrieving a Full Tree") для выполнения этой операции кол-во LEFT JOIN прямопропорционально кол-ву "уровней вложенности" - 1. Другими словами, если захочется добавить нового потомка в дерево, "уровень вложенности" которого будет на единицу больше "уровней вложенности" остальных узлов, то придется "ручками" еще дописывать одно LEFT JOIN. ;) P.S. Хорошо конечно, когда есть хоть что-то, но имхо MySQL уже пора делать поддержку для работы с иерархическими структурами данных. Не, ну тогда делайте так - я просто не написал сразу в силу очевидности решения.... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2005, 19:00:16 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
А, понял почему вопрос! Я когда на Oracle работал, тоже так не умел :-) Кстати, в предыдущем посте неточность, элемент 3-го уровня вставляется на 2-й, надо Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2005, 19:10:53 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
2 Astron Может я не совсем догоняю Вашу мысль, но запрос не дает визуального представления дерева. Т.е. при выводе данных не сохраняются рекурсивные зависимости parent_id - id. Возможно это просто неуданый пример. Позвольте немного изменить ваш запрос (для наглядности). Код: plaintext Код: plaintext 1. Код: plaintext Код: plaintext 1. 2. 3. 4. 5. Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Запрос, который Вы превели выше выводит следующее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Данный запрос выводит тоже самое: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Зачем тогда вложенный селект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2005, 10:46:04 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
Внимательно пока статью не читал, но посмотрев запросы - не получится нормального визуализирования. Вообще подход к визуализации дерева с ключем и ссылкой на владельца можно осуществить только рекурсивно, что пока невозможно реализовать даже в версии 5.0, тем более что с версии 5.0.10, если не ошибаюсь даже рекурсию выключили (временно) в процедурах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2005, 12:49:34 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
Ну во-первых извиняюсь за мелкую ошибку в подзапросе. Ниже видно какая. Во-вторых я не стремился визуализировать дерево, я делал аналог оракловых START WITH - CONNECT BY После ваших апдейтов слегка модифицированный запрос выдает следующее, что соответствует результату оракловой конструкции. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2005, 14:15:32 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
Внимательно прочитал первый пост - автору нужно ПОДНЯТЬСЯ по дереву, а это уже совсем другая песня, да... Тут без PREV ораклового не обойтись, действительно. Это спускаться по дереву можно с любого места, хоть с подзапросом хоть без, а вверх разве что принять что ID парента всегда меньше чайлда и ограничить это в условии. Получив при этом кучу лишнего, разумеется, и фильтровать это уже на клиенте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2005, 15:26:18 |
|
||
|
Построение навигации средствами Mysql
|
|||
|---|---|---|---|
|
#18+
И я вот еще чего не пойму... В чем собственно проблема? > Есть таблицу с древовидной структурой Tree. > Поля таблицы Tree: > ID (целое) - идентификатор объекта > ParentID (целое) - идентификатор "родителя", если верхний уровень, то 0 > Level (целое) - уровень объекта, самый верхний - 0, делее 1,2.... > Path (строка) - самое интересное :) список идентификаторов ВСЕХ родителей через запятую (например 23,15,46,12). Порядок в списке особо не важен > > Запрос пути: > SELECT .... FROM Tree WHERE FIND_IN_SET(ID,ObjPath) ORDER BY Level > > ObjPath - поле Path обекта, путь к котрому надо найти. Если известен только ID объекта, тогда придется сделать два запроса > > SELECT @ObjPath:=Path FROM Tree WHERE ID=ObjID; > SELECT .... FROM Tree WHERE FIND_IN_SET(ID,@ObjPath) ORDER BY Level; > > В результате получим таблицу - список родителей начиная с самого верхнего, заканчивая самым последним. > Для автоматического формирования полей Level и Path при вставке(переименовании, удалении) можно использовать триггеры или, как это сделал я, написать код в языке программирования. > > Воть. Ничего особенного в этом способе нет. Как выяснилось позже, этот способ давно найден и успешно эксплуатируется. А я его повторно "открыл". Вывод - надо лучше искать в Интернете :). > > P.S. А может есть способ проще? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2005, 17:34:08 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=33219979&tid=1853739]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 520ms |

| 0 / 0 |
