2010-11-09 5 views
0

Мне нужна помощь здесь.Нужна помощь в создании процедуры

Моя таблица

CREATE TABLE `users` (
    `id` bigint(11) NOT NULL auto_increment, 
    `point` bigint(11) NOT NULL, 
    `lefth` bigint(11) NOT NULL, 
    `righth` bigint(11) NOT NULL, 
    `referel` bigint(11) NOT NULL, 
    `dateadded` timestamp NOT NULL default CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=21 ; 

данных

INSERT INTO `users` VALUES (1, 1000, 2, 4, 1, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (2, 0, 3, 5, 1, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (3, 0, 6, 9, 1, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (4, 0, 14, 7, 1, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (5, 0, 8, 0, 2, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (6, 0, 0, 0, 3, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (7, 0, 15, 19, 4, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (8, 0, 10, 11, 5, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (9, 0, 0, 0, 3, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (10, 0, 0, 0, 8, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (11, 0, 12, 13, 8, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (12, 0, 0, 0, 11, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (13, 0, 0, 0, 11, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (14, 0, 16, 17, 4, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (15, 0, 0, 0, 7, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (16, 0, 0, 0, 4, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (17, 0, 0, 18, 14, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (18, 0, 0, 0, 17, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (19, 0, 20, 0, 7, '0000-00-00 00:00:00'); 
INSERT INTO `users` VALUES (20, 0, 0, 0, 19, '0000-00-00 00:00:00'); 

Я хочу написать процедуру, если обеспечить значение в качестве параметра будет возвращать все значения образуют таблицу, которая приходит под переданный параметр.

что-то вроде этого

DELIMITER $$ 
-- 
CREATE DEFINER=`root`@`localhost` PROCEDURE `emp_heir`(
     IN param1 INTEGER(11) 
    ) 
BEGIN 
select lefth from users where id = param1; 
END$$ 

это будет возвращать только значение в lefth колонки, но если значение lefth оказывают значения дочерних (значения в lefth и righth этого идентификатора) он должен вернуться, что также , как мудрый, он должен продолжаться до конца стола.

Как это можно сделать?

Thanks

+0

Не могли бы вы исправить форматирование вашего вопрос? – Bobby

ответ

0

Это то, что вы хотите?

DELIMITER $$ 

CREATE PROCEDURE my(
    IN number INT, 
    OUT lefte INT, 
    OUT righte INT 

) 
BEGIN 
    SELECT lefth, righth 
    FROM users WHERE id = number INTO lefte , righte; 

END; 

$$ 

DELIMITER ; 

вызов, как:

CALL my(4,@lefth,@righth); 
SELECT @lefth,@righth; 
0
CREATE DEFINER=`root`@`localhost` PROCEDURE `emp_heir` (IN param1 INTEGER(11)) 
BEGIN 
    DECLARE lh INT(11); 
    DECLARE rh INT(11); 
    DECLARE lresult VARCHAR(255) default ''; 
    DECLARE rresult VARCHAR(255) default ''; 
    SET lh := param1; 
    SET rh := param1; 
    REPEAT 
     SELECT lefth FROM users WHERE id = lh INTO lh; 
     SET lresult := CONCAT(lresult, lh, ','); 
    UNTIL lh = 0 END REPEAT; 
    REPEAT 
     SELECT righth FROM users WHERE id = rh INTO rh; 
     SET rresult := CONCAT(rresult, rh, ','); 
    UNTIL rh = 0 END REPEAT; 
    SELECT LEFT(lresult, LENGTH(lresult) - 3) AS lefths, LEFT(rresult, LENGTH(rresult) - 3) AS righths; 
END$$ 

Вы Meen что-то подобное? Эта процедура рекурсивно получает все значения lefth и righth и помещает их в отдельные строки.

+0

Спасибо. Это почти сработало.Но как только правая или левая часть переданного параметра извлекается, тогда он должен извлекать правые и левые дочерние значения. – zamil

+0

Я изменил запрос на этот_BEGIN DECLARE lh INT (11); DECLARE rh INT (11); DECLARE lresult VARCHAR (255) default ''; DECLARE rresult VARCHAR (255) default ''; SET lh: = param1; SET rh: = param1; REPEAT SELECT lefth, righth FROM users WHERE id = lh или id = rh INTO lh, rh; SET lresult: = CONCAT (lresult, lh, ',', rh, ','); UNTIL lh = 0 и rh = 0 END REPEAT; SELECT LEFT (lresult, LENGTH (lresult) - 3) AS lefths; END ', но это дает результат ошибки, состоящий из нескольких строк' – zamil

+0

Правильно, 'SELECT ... INTO ...' не может работать с несколькими строками. – rMX

1
CREATE DEFINER=`root`@`localhost` PROCEDURE `emp_heir` (IN param1 INTEGER(11), INOUT lResult VARCHAR(255), INOUT rResult VARCHAR(255)) 
BEGIN 
    DECLARE lh INT(11); 
    DECLARE rh INT(11); 

    IF lResult IS NULL THEN 
     SET lResult := ''; 
    END IF; 
    IF rResult IS NULL THEN 
     SET rResult := ''; 
    END IF; 

    SELECT lefth, righth FROM users where id = param1 INTO lh, rh; 

    IF lh != 0 THEN 
     SET lResult := CONCAT(lResult, lh, ','); 
    END IF; 
    IF rh != 0 THEN 
     SET rResult := CONCAT(rResult, rh, ','); 
    END IF; 

    IF lh != 0 THEN 
     CALL emp_heir(lh, lResult, rResult); 
    END IF; 
    IF rh != 0 THEN 
     CALL emp_heir(rh, lResult, rResult); 
    END IF; 
END$$ 

Проверьте это. Для тестирования:

call emp_heir(2, @lresult, @rresult, 0); 
select @lresult, @rresult; 

Просто интересно, почему бы вам не сделать это в приложении? =)

UPD

Если вы получаете сообщение об ошибке на этом, выполнить

SET max_sp_recursion_depth = 10; 

Если ошибка будет появляться снова, попробуйте увеличить значение

+0

Выполняется правильно. Но результат не отображается – zamil

+0

Хм .. Я выполнил это по данным вашего вопроса, и я получил + -------------- + ------ ------ + | @lresult | @rresult | + -------------- + ------------ + | 3,6,8,10,12, | 5,9,11,13, | + -------------- + ------------ + – rMX

+0

да, я получил его сейчас. ранее я использовал sql manager 2010. получил результат, когда я запустил его из phpmyadmin.this не является результатом, который я искал. если я даю 2 в качестве начального значения, то ludult shud содержит 3,6,9, а результ должен содержать 5,8,10,11,12,13. я сам это пробовал, но не повезло – zamil

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