[php, sql] вывести дерево из бд

dasha69

Есть таблица, в которой 2 колонки. В первой(id) хранится id католога, во второй(parent_id) - id родительского католога.
Как из такой структуры вытащить дерево в виде массива с соответствующей вложенностью?
Заранее спасибо

Fragaria

рекурсивно?

dasha69

а разве по-другому можно его вабрать?
по-моему только рекурсивно

artimon

Ну так, а в чём тогда проблема, если ты понимаешь, что это надо сделать рекурсивно?

dasha69

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

stm7884696

а не рекурсивно, а одним запросом?

sergei1969

можно препроцессинг рекурсивно, а потом в один запрос

stm7884696

это то да, но вроде как проскакивала в разделе тема с тремя тестовыми заданиями, и как раз одним из них был вывод такой структуры в один запрос...

jenua82

Любую рекурсию можно раскрыть.

stm7884696

а конкретно эту как раскрыть не подскажешь?

dasha69

Создаешь в pgadmin - е такую функцию:
 
CREATE OR REPLACE FUNCTION treebranch(int4, int4)
RETURNS SETOF record AS
'DECLARE
start_node ALIAS FOR $1;
val ALIAS FOR $2;
ret RECORD;
BEGIN
FOR ret IN SELECT * FROM table1 WHERE f1=start_node
RETURN NEXT ret;
FOR ret IN SELECT * FROM treebranch(ret.f1,val) as t1 (f2,f3,f4,f5,...) LOOP
RETURN NEXT ret;
END LOOP;
END LOOP;
RETURN;
END;
'
LANGUAGE 'plpgsql' VOLATILE;

И пользуешь её для выборки в один запрос.

stm7884696

pgadmin
это что?
я вообще то про стандартные переносимые методы спрашивал....

dasha69

pgadmin - интерфейс к PostgreSQL (типа MySQLAdministrator etc.)
без pgadmin-а по-моему хранимую процедуру тоже можно написать
насчет переносимости тоже вроде все впорядке - главное, чтобы сервер баз данных поддерживал хранимые процедуры.
про то как любую рекурсию раскрыть - правда интересный вопрос.

stm7884696

ааа.... а для мускуля есть решение?

sergei1969

тоже самое сделать не процедурой, а из скрипта и записать в табличку
не надо будет каждый раз процедуру дёргать

Fragaria

MySQL начиная с 5-й версии поддерживает хранимые процедуры.

stm7884696

понятно, спасибо......
Оставить комментарий
Имя или ник:
Комментарий: