Несколько возможных подходов. Я пойду от того, что вы хотите сделать, к тому, что я вам предлагаю.
Материализованного Путь
К сожалению, перечисленный путь происхождение (например, происхождение) is expensive and tricky to do with SQL only (смотрите раздел материализовались Path найти "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)
Список смежность
Или, вы можете воспользоваться списком смежности а также использовать выражение Common Table или CONNECT BY
вместо этого в зависимости от базы данных (это игнорирует столбец ancestry
). См. Мой вопрос о различных способах использования representing hierarchical data in an RDBMS для получения информации о работе с списком Adjacency для запроса предка (см. Раздел «Примечания к базе данных» в конце вопроса).
Nested Set
Вы пишете ваши данные не изменяются и вы хотите запросить родословную. Вложенное представление множества - идеальный подход в этой ситуации, потому что получение информации, которую вы хотите с помощью SQL, просто, работает с любой базой данных и очень дешево. Даунсайд - это ходы, а вставки стоят дорого. Managing Hierarchical Data in MySQL, вероятно, лучшее объяснение, которое я могу предоставить, как это работает.
Nested Set является то, что я хотел бы использовать учитывая ваши данные, что вы хотите сделать, и что она не изменится.