Перечисление пути mySQL Запросы для создания крошки хлеба - PullRequest
3 голосов
/ 15 января 2011

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

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

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

id woeid parent_woeid country_code name language place_type ancestry

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

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

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

([] = a placeholder)

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

1 Ответ

5 голосов
/ 16 января 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...