MySQL Forums
Forum List  »  Russian

Хранимые процедуры и иерархическое дерево
Posted by: Herman Klushin
Date: February 09, 2009 04:08AM

Когда то делал это легко и просто на Interbase - а на MySQL просто мучение одно!
Наваял что-то подобное:

CREATE DEFINER=`root`@`%` PROCEDURE `get_all_child_ids`(
IN base INT UNSIGNED,
IN max_levels INT,
OUT ids MEDIUMTEXT)
BEGIN
DECLARE currlevel INT DEFAULT 0;
SET @parents = base;
-- В случае если max_levels равно 0, то допускаем 100000 уровней.
-- Отрицательные значения дадут один уровень — это побочное явление.
SET currlevel = IF(max_levels, 1, -100000);
SET ids = '';
REPEAT
SET ids = CONCAT(ids, ',', @parents);
SELECT GROUP_CONCAT(objID) INTO @parents FROM lsk_catalog_structure
WHERE parentID IN (@parents);
SET currlevel = currlevel + 1;
UNTIL (@parents IS NULL OR currlevel > max_levels) END REPEAT;
SET ids = SUBSTR(ids, 2);
END$$

так вот в чем проблема -
в половине случаев отрабатывает все ок, а в половине берет только одну ветку дерева :(

Тогда я попробовал сделать более правильно-заменить селект на препаре конструкцию:
SET @stm = CONCAT(
'SELECT GROUP_CONCAT(', name_id, ') INTO @parents FROM ', name_table,
' WHERE ', name_parent,' IN (', @parents, ')');
PREPARE fetch_childs FROM @stm;
EXECUTE fetch_childs;
DROP PREPARE fetch_childs;

Работает правильно, но из ПХП не запускается - говорит не тот контекст :(((
Помогите плииииз!

Новое Поколение - моя церковь,
Иисус Христос - мой Бог!

Options: ReplyQuote


Subject
Views
Written By
Posted
Хранимые процедуры и иерархическое дерево
7472
February 09, 2009 04:08AM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.