簡體   English   中英

在創建過程時需要一些幫助

[英]Need some help in creating a procedure

我需要一些幫助。

我的桌子是

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中的值),則它也應返回該值。 就像明智的做法一樣,它應該持續到表格末尾。

如何做到這一點?

謝謝

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;

如果錯誤再次出現,請嘗試增加該值

這就是你想要的嗎?

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;
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$$

你有沒有這樣的意思? 此過程以遞歸方式獲取所有lefthrighth值,並將其放入單獨的字符串中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM