Несколько возможных подходов.Я пойду от того, что ты хочешь сделать, к тому, что я предлагаю тебе сделать.
Материализованный путь
К сожалению, происхождение перечисленного пути (например, происхождение) дорого и сложно сделать только с SQL (см. Раздел по Материализованный путь найти "An employee FORD and chain of his supervisors"
).Если у вас есть путь впереди времени и вы можете работать с каким-то языком программирования, самый простой подход заключается в использовании предложения IN
:
SELECT *
FROM woe
WHERE ancestry IN (
'1',
'1/23424975',
'1/23424975/24554868',
'1/23424975/24554868/12602167',
'1/23424975/24554868/12602167/12696151'
)
ORDER BY LEN(ancestry)
Список смежности
Или вы можетеВоспользуйтесь преимуществами аспекта «Список смежности» ваших данных и используйте вместо них общее выражение таблицы или CONNECT BY
в зависимости от базы данных (игнорируется столбец ancestry
).См. Мой вопрос о различных способах представления иерархических данных в СУБД для получения информации о работе со списком смежности для запроса происхождения (см. Раздел Примечания к базе данных в конце вопроса).
Вложенный набор
Вы пишете, что ваши данные не меняются и вы хотите запросить происхождение.Представление вложенного набора является идеальным подходом в этой ситуации, поскольку получение необходимой информации с использованием только SQL легко, работает с любой базой данных и является очень дешевой операцией.Недостатком является движение и вставки стоят дорого. Управление иерархическими данными в MySQL , пожалуй, лучшее объяснение того, как оно работает.
Вложенный набор - это то, что я бы использовал с учетом ваших данных, что вы хотите сделать, и что они не меняются.