|
Модераторы: skyboy |
|
polin11 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 122 Регистрация: 6.6.2015 Репутация: нет Всего: нет |
СУБД postgresql.
Помогите написать хитровыдуманный запрос, есть иерархическая таблица - боги Древней Греции. У каждой записи, есть поле parent_id - идентификатор родителя записи, level - уровень записи. Уровень 1. Корень - Хаос (дети: Зевс, Посейдон) Уровень 2. Зевс (дети: Афина, Гермес) Посейдон(дети: Тритон) Уровень 3. Афина (дети: Эрхитоний) Гермес (дети: нет) Тритон (дети: нет) Уровень 4. Эрхитоний (дети: нет)
Как итог имеем n-арное дерево, нужно написать хитровыдуманный запрос, который сделает прямой обход этого дерева. В итоге нужно получить список 1) Хаос 2) Зевс 3) Афина 4) Эрхитоний 5)Гермес 6) Посейдон 7) Тритон |
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: нет Всего: 386 |
polin11, А цель хитровыдуманности какая ? Для обучения и спорта, или потом с этим надо будет жить ? Если жить - то можно трансформировать табличку в nested-sets (добавить в нее пару полей) и получать поддерево любой веточки одним простым запросом.
Если хочется спорта и постгресса, то вот поправленный запрос с предыдущего ответа https://www.db-fiddle.com/f/6iRkVhCfa3Z6wuw6dMETC5/0 P.S. Куда-то пропал предыдущий ответ, но мы его помним ... Это сообщение отредактировал(а) ksnk - 22.11.2018, 11:52 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 453 |
Обход дерева в глубину - это итерационная задача, а не реляционная. Решать её нужно на стороне клиента. Можно, конечно, делать это и на стороне сервера в формате хранимой процедуры - но неразумно. Только если в реальной задаче соотношение размера записи таблицы к размеру записи выходного набора достаточно велико (хотя бы 2). А поле level в данной задаче вообще нафиг не нужно. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Snowy |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 1 Всего: 484 |
|
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 453 |
Snowy, нормализуйте g.id ведущими нулями - иначе при сортировке чисел как строк всё поплывёт... или добавьте разделитель.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Snowy |
|
|||
Эксперт Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 1 Всего: 484 |
||||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |