SQL-рекурсив: выберите все дочерние элементы данного узла в дереве - PullRequest
0 голосов
/ 15 января 2012

РЕДАКТИРОВАТЬ: После прочтения некоторых ваших ответов я заметил, что мне не нужна рекурсия, но некоторые запросы для работы с деревом.В настоящее время я читаю следующий пост http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/, который дает основные понятия, которые я не знал, и правильный путь.Большое спасибо, я буду продолжать читать опубликованные ссылки:)

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

CREATE TABLE IF NOT EXISTS `arbres` (
  `node_id` int(11) NOT NULL AUTO_INCREMENT,
  `pare_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`node_id`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=470 ;
ALTER TABLE arbres ADD CONSTRAINT FK_E6A4F221A4467B16 FOREIGN KEY (pare_id) REFERENCES arbres(node_id) ON DELETE CASCADE;

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

1 Ответ

0 голосов
/ 15 января 2012

Лучше всего обходить дерево по узлам. Поскольку нет гарантии, сколько уровней будет иметь ваше дерево, попытка найти один запрос, вероятно, не очень хорошая практика. Нет ничего плохого в том, чтобы иметь один запрос или процедуру, которая возвращает дочерние элементы для данного родителя несколько раз, например:

select node_id from arbres where pare_id = 1

Это предполагает, что ваш корень pare_id = 1 Затем сделайте то же самое для каждого возвращаемого узла. Если ни один узел не возвращается, вы знаете, что ваш последний узел был листом.

Если вам действительно нужно добиться всего этого одним запросом, просто выполните

select * from arbres

И пересмотрите дерево, на котором вы когда-либо используете язык программирования.

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