Перечисление пути MySQL Запрос для создания хлебной крошки

Я хотел бы создать хлебную крошку из столбца с перечислением пути.

Вот пример набора данных, который у меня есть.

https://spreadsheets.google.com/ccc?key=0AsGYQbeSAIgFdGRscFpsZFJpQUtfWGIwYWNUY2ktRHc&hl=en_GB&authkey=CPOuuogF

id woeid parent_woeid country_code name language place_type ancestry

ancestry — это пронумерованный путь, например, 1/23424975/24554868/12602167/12696151 — это путь до Брайтона в Англии.

Я хотел бы получить навигационную цепочку, запросив столбец name и получить всех родителей.

т.е. Мир, Европа, Англия, [Графство], [Город], [Регион], [Место]

([] = a placeholder)

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


person Layke    schedule 14.01.2011    source источник


Ответы (1)


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

Материализованный путь

К сожалению, перечисление предков по пути (например, отцовство) дорого и сложно сделать только с помощью 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, пожалуй, лучшее объяснение, которое я могу дать как это работает.

Вложенный набор — это то, что я бы использовал, учитывая ваши данные, то, что вы хотите сделать, и что они не меняются.

person orangepips    schedule 15.01.2011