Запрос с Рекурсией

martinelli

Новичок
Запрос с Рекурсией

Всем доброго времени суток
Есть база с полями:

ID - уникальный номер елемента
CID - ссылка на ID начальника

если CID == 0 , то это верхний уровень.
Можно ли вывести всю цепочку от текущего элемента до верхнего одним SQL запросом, или это можно сделать только Рекусивно вызывая запрос за запросом, пока CID не станет равным 0?
 

doctor Ruust

Guest
Можно было бы, если бы запрос с переменными переустанавливал бы каждую переменную после выборки каждой строчки...
select (@prev := id) as id, cid from table where cid = 0
union
select (@prev := id) as id, cid from table where cid = @prev;
 

fixxxer

К.О.
Партнер клуба
Если бы у бабушки были яйца, она была бы дедушкой.

Если вложенность ограничена, можно джойнить таблицу саму с собой по id=cid N раз...
 

doctor Ruust

Guest
Можно и так.
PHP:
mysql_query('select @prev:=0');
$sql = 'select (@prev := id) as id, cid from table where cid = @prev';
while($row = mysql_fetch_array(mysql_query($sql))) {
}
 

ONK

Пассивист PHPСluba
doctor Ruust Вопрос был:

Можно ли вывести всю цепочку от текущего элемента до верхнего
а ты привёл пример выборки дерева от корня к листьям (а требуется наоборот).

Другое дело что запрос можно немного изменить и он будет делать то что надо (если будет).

Вобщем решение интересное, (если оно работает).
 

ONK

Пассивист PHPСluba
Falc, я бы не сказал что это бред, смысл здесь есть, но я не уверен что переменная которой присваивается значение в "select_expression" может рекурсивно быть использована (передать это значение) в "where_definition"
 

Falc

Новичок
ONK Смысл может, конечно и есть, а вот толку точно нет.
Это работать не будет.
Я уж молчу про:
>>mysql_query('select @prev:=0');
Так значения переменным не присваивают.
 

Falc

Новичок
doctor Ruust
Надаже какой топик всплыл.
А теперь объясни мне что делает строчка:
while($row = mysql_fetch_array(mysql_query($sql))) {}
 

doctor Ruust

Guest
Ошибка в двух предыдущих строках, а не в этой. cid и id местами надо поменять, вместо 0 поставить значение. Меня "c" с толку сбило, я видимо подумал, что это значит child.
 

Falc

Новичок
doctor Ruust
Во-первых твой пример не из одного запроса.

Во-вторых он просто не рабочий.
 

Falc

Новичок
doctor Ruust
Тогда чем он лучше рекурсивной функции на ПХП?
 

doctor Ruust

Guest
Лаконично и это хороший вариант для mysqli_prepare.
 

Falc

Новичок
doctor Ruust
>>Лаконично и это хороший вариант для mysqli_prepare.

Что-то ты какимито загадками говоришь.

Если можно то по пунктам чем он лучше.
 

doctor Ruust

Guest
Кратко написано. Без JOINов. В PHP5 с MySQL4.1 ты его один раз откомпилишь (mysqli_prepare, кажется), а потом несколько раз будешь использовать.
 

Falc

Новичок
doctor Ruust
>>В PHP5 с MySQL4.1 ты его один раз откомпилишь (mysqli_prepare, кажется), а потом несколько раз будешь использовать.
Про это неслышал, да и ПХП 5 еще нету.

С обычной рекурсией в ПХП тоже никакиз JOINов, и на 2 запроса меньше.
 

гоша

Guest
martinelli

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

Если таблица сильно большая -- подумать о переходе на нестед сеты.

А так -- много запросов делать, в цикле. А рекурсия тут никаким боком.
 
Сверху