Задать вопрос
usdglander
@usdglander
Yipee-ki-yay

Как написать запрос к таблице с внутренней связью?

Мне кажется вопрос элементарный, но то, что нарыл инете - вообще не про то. Суть такова:
Есть таблица:
id;name;parent
1;alex;0
2;mary;1
3;alice;1
4;hoover;2

поле parent - ссылка на id родителя.
Возможно ли как то одним запросом получить всю цепочку элементов для заданного id? Например для id = 4 получить:
id;name;parent
4;hoover;2
2;mary;1
1;alex;0

Заранее спасибо.
  • Вопрос задан
  • 201 просмотр
Подписаться 3 Оценить Комментировать
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
Если вложенность ограничена, то можно использовать джойны (по количеству уровней вложенности). Но даже в этом случае, так, как у вас в вопросе, не получится - всё будет одной строкой.
Если вложенность неограничена, то никак.
Ответ написан
Комментировать
27cm
@27cm
TODO: Написать статус
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kostia256
@kostia256
id;name;parent
1;alex;0
2;mary;1
3;alice;1
4;hoover;2

Преобразуйте в 2 таблицы вида:
id;name
1;alex
2;mary
3;alice
4;hoover

parent_id;element_id
1;2
1;3
1;4
2;4


Список всех родителей для элемента 4:
SELECT * FROM `people` WHERE `id` IN (SELECT `parent_id` FROM `people_tree` WHERE `element_id` = 4)

Список всех детей для элемента 1:
SELECT * FROM `people` WHERE `id` IN (SELECT `element_id` FROM `people_tree` WHERE `parent_id` = 1)


Для удобства можно добавить к таблице `people` поля level и position, и получать детей либо родителей на любое количество уровней вложенности. А position для позиционирования элементов на каждом уровне для каждого родителя.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы