2016-02-05 3 views
2

У меня есть эта таблица в MySQL:MySQL рекурсивный выбор из одной таблицы

| id | mainid | name    | 
+----+--------+---------------------+ 
| 1 | 0  | main 1    | 
| 2 | 1  | sub 1    | 
| 3 | 1  | sub 2    | 
| 4 | 1  | sub 3    | 
| 5 | 4  | subsub 1   | 
| 6 | 4  | subsub 2   | 
| 7 | 0  | main 2    | 
| 8 | 7  | sub 4    | 
| 9 | 7  | sub 5    | 

Поле mainid является ассоциированным с id полем.

Есть ли передовая практика в командах MySQL для выбора всех рекурсивных строк? Я хочу, чтобы select все подэлементы по основному элементу.

Я пытался выбрать все подразделы на первом уровне, например, к югу от 1, к югу 2, sub3 находится под основной 1. Это просто:

SELECT id, mainid, name FROM mytable WHERE mainid = '1'; 

Но есть одна линия-команда, чтобы выбрать тот же строки И строки subsub1 и subsub 2 тоже? (И Кур, если я создаю еще более глубокие уровни вот тоже.)

+1

Выборы включают , но не ограничиваются следующими: - Присоединить таблицу к себе столько раз, сколько может потребоваться; - обрабатывать рекурсию на уровне приложения, например с циклом PHP. Используйте хранимую процедуру для обработки рекурсии. . Переключитесь на вложенный набор (или какую-то гибридную модель) вместо «так называемой» модели списка адресов. Все эти решения более подробно рассматриваются в другом месте, в том числе ряд отличных, популярных и, следовательно, легко googled статей по иерархическим данным и MySQL. – Strawberry

+0

[Деревья в SQL] (http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html) также могут помочь – urban

ответ

0

вам нужно временные таблицы и отдельные хранимые процедуры

первая хранимая процедура получит «родительский» идентификатор и создать таблицу результата TEMP:

РЕЗУЛЬТАТ (идентификатор, mainid, имя)

и чек временной таблицы

пРОВЕРКА (идентификатор, принятая) (эта таблица необходима, чтобы избежать бесконечных циклов)

Таким образом, идея заключается в том, что вы называете внутреннюю хранимую процедуру, а внутренняя сохраняется что-то вроде этого

PROC (currentId (интермедиат))

с родительским идентификатором и прок будет делать в основном то, что ваш запрос был выполнен, но сохраните его во внутренней таблице temp, а затем для каждого элемента этой таблицы temp (который не находится в CHECK) он пометит его как переданный в CHECK (просто вставьте строку) и вызовет тот же процесс для каждого из «детей» currentId

Затем вставьте все данные из внутренней таблицы темпа в РЕЗУЛЬТАТ, и у вас будет весь список потомков

у вас есть 2 способа

проверки детей, а затем вставить в РЕЗУЛЬТАТЕ или вставить РЕЗУЛЬТАТ, а затем проверить детей

данные будут упорядочены по-разному, но результат должен быть таким же

Смежные вопросы