MySQL Self-Join - PullRequest
       3

MySQL Self-Join

3 голосов
/ 08 сентября 2010

У меня есть таблица (это нельзя изменить), как показано ниже:

POST_ID | PARENT_ID | POST_NAME

1       | 0         | Services
4       | 1         | Development
5       | 4         | Magento
2       | 0         | Contact

Поле 'parent_id' ссылается на post_id для формирования внешнего ссылочного ключа.Можно ли написать один запрос для соединения поста и его родителей на основе post_id?

Например, если бы у меня был post_id 5 (Magento), мог бы я написать запрос для получения следующих результатов:

5 | Magento
4 | Development
1 | Services

Я знаю, что это довольно легко сделать с несколькими запросами, однако, хотелось бы знать, возможно ли это с помощью одного запроса.

Спасибо:)

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Конечно, поскольку вы используете MySQL, я бы предложил изменить модель данных на nested sets или materialized path.

Однако, если вы застряли со списком смежности, вот способзапросить его (требует создания пользовательской функции):

2 голосов
/ 08 сентября 2010

Вы организуете свои иерархические данные, используя модель списка смежностей .Тот факт, что такие рекурсивные операции являются сложными, фактически является одним из основных недостатков этой модели.

Некоторые СУБД, такие как SQL Server 2005, Postgres 8.4 и Oracle 11g, поддерживают рекурсивные запросы с использованием общих табличных выражений с ключевым словом WITH (см. Также комментарий @ Quassnoi ниже).Эта функция позволяет легко писать такие запросы, но, как упоминалось в комментарии выше, @ OMG Ponies , MySQL пока не поддерживает рекурсивные запросы.

Вы упомянули, что не можете сделатькакие-либо изменения в вашей таблице, но вы можете добавить дополнительную таблицу?Если да, возможно, вас заинтересует следующая статья, в которой описывается альтернативная модель (модель вложенного набора ), которая упрощает (возможно) рекурсивные операции:

Кроме того, я также предлагаю проверить следующую презентацию @ Билла Карвина , постоянного участника StackПереполнение:

Модель таблицы замыкания, описанная в презентации, является очень допустимой альтернативойна вложенный набор.Далее он описывает эту модель в своей книге SQL Antipatterns ( отрывок из главы по этой теме [PDF]).

В противном случае вы можете захотеть сделать рекурсивныйучастие в вашем приложении, загрузка всех данных, построение дерева и прохождение по нему.

...