рекурсивный самостоятельный запрос

У меня есть следующая таблица:

myTable:
+----+----------+
| id | parentID |
+----+----------+
|  1 |     null |
|  2 |        1 |
|  3 |        1 |
|  4 |        2 |
|  5 |        4 |
-----------------

Я хотел бы, чтобы все строки отслеживались, пока больше не будет родительского идентификатора. Итак, ".... WHERE id = 5" даст мне:

5, 4, 2, 1

person iddqd    schedule 18.07.2010    source источник
comment
Обычный Билл Карвин создал приятное объяснение иерархических данных и того, как использовать различные решения: slideshare.net/billkarwin/models-for-hierarchical-data   -  person Wrikken    schedule 18.07.2010
comment
MySQL не имеет рекурсивных CTE, поэтому я думаю, что для этого понадобится курсор, если вам нужно обрабатывать произвольную глубину. Меняет структуру dev.mysql.com/tech-resources/articles/ иерархические-данные.html вариант? Или можно предположить некоторую максимальную глубину? Также см. Этот связанный вопрос stackoverflow.com/questions/169817/   -  person Martin Smith    schedule 18.07.2010
comment
Слайды Билла Карвина действительно классные.   -  person iddqd    schedule 24.07.2010


Ответы (1)


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

Некоторые СУБД, такие как SQL Server 2005, Postgres 8.4 и Oracle 11g, поддерживают рекурсивные запросы с использованием общих табличных выражений с ключевым словом WITH.

Что касается MySQL, вам может быть интересно ознакомиться со следующей статьей, в которой описывается альтернативная модель (модель вложенных множеств), что упрощает (возможно) рекурсивные операции:

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

person Daniel Vassallo    schedule 18.07.2010
comment
Хорошо, большое спасибо за ссылки и комментарии, теперь я понял. Поскольку я не предполагаю, что деревья очень глубокие и мне это нужно редко, я решил просто выполнить два самостоятельных соединения, и если parentID по-прежнему НЕ ПУСТОЙ, я снова запускаю запрос. - person iddqd; 19.07.2010
comment
@iddqd: Да, это выполнимо. Но, как вы видите, это ограничение этой модели. - person Daniel Vassallo; 19.07.2010