Sql 在创建过程中需要一些帮助吗

Sql 在创建过程中需要一些帮助吗,sql,mysql,stored-procedures,Sql,Mysql,Stored Procedures,我需要一些帮助 我的桌子是空的 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

我需要一些帮助

我的桌子是空的

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中的值具有子值(该id的lefth和righth中的值),则它也应返回该值。像怀斯一样,它应该一直持续到桌子的尽头

如何做到这一点


谢谢

这就是你想要的吗

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;
你遇到过这样的事吗?此过程递归获取所有
lefth
righth
值,并将其放入单独的字符串中

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;

如果错误再次出现,请尝试增加值

是否可以修复问题的格式?谢谢。这几乎成功了。但是一旦获取了传递参数的righth或lefth,它就必须获取子值的righth和lefth。我将查询更改为“BEGIN DECLARE lh INT(11)”;声明rh INT(11);声明lresult VARCHAR(255)默认值“”;声明rresult VARCHAR(255)默认值“”;设置lh:=参数1;设置相对湿度:=param1;重复从id=lh或id=rh的用户选择lefth、righth进入lh、rh;设置lresult:=CONCAT(lresult,左侧','右侧',');直到lh=0和rh=0结束重复;选择LEFT(lresult,LENGTH(lresult)-3)作为lefths;结束“但这会给出错误”结果,包含多行“正确,
SELECT。。。进入…
无法处理多行。嗯。。我已经根据你问题中的数据执行了这个,我得到了+----------------+@lresult.@rresult.+--------------+------+------+------++----3,6,8,10,12,| 5,9,11,13,|+--------------+------是的,我现在得到了。以前我使用的是sql manager 2010。当我从phpmyadmin运行它时得到了结果。这不是我想要的结果。如果我给2作为初始值,lresult应该包含3,6,9,rresult应该包含5,8,10,11,12,13。我自己也在试,但运气不好
SET max_sp_recursion_depth = 10;