繁体   English   中英

使用MySQL测试叶节点

[英]Testing for Leaf Node with MySQL

在此问题上停留了大约2个小时,我执行了此过程,该过程需要一条边和一个集合,并返回布尔leaf以测试某个节点是否为叶子。 但是,该测试仅适用于左侧节点,一旦进入第二个循环,它就会崩溃,我无法弄清原因:

CREATE  PROCEDURE `is_leaf`(IN `edge` VARCHAR(12), IN `eset` VARCHAR(512), OUT `leaf` INT)
BEGIN

declare lnode char(6) default substring_index(edge, ':', 1); -- left node of edge.
  declare rnode char(6) default substring_index(edge, ':', -1); -- right node of edge.
  declare cedge char(12);
  declare lnode_in_cedge char(6);
  declare rnode_in_cedge char(6);
  declare found int default 1;
   declare OGset varchar(512) default '';
  SET OGset= concat('',eset);

--CHECKS LEFT NODE OF EDGE AGAINST ALL EDGES IN SET
WHILE length(eset)!=0 AND found!=2 DO
set cedge = substring_index(eset, ',', 1);
SET lnode_in_cedge= substring_index(cedge, ':', 1);
SET rnode_in_cedge= substring_index(cedge, ':', -1);

--IF LEFT NODE IS FOUND TO HAVE COMMON VERTEX, THE SAME TEST IS RUN FOR THE RIGHT ONE
IF lnode= lnode_in_cedge OR lnode= rnode_in_cedge THEN
    BEGIN
        SET leaf=false;

    SET eset= OGset;
    WHILE length(eset)!=0 AND found !=2 DO
    set cedge = substring_index(eset, ',', 1);
    SET lnode_in_cedge= substring_index(cedge, ':', 1);
    SET rnode_in_cedge= substring_index(cedge, ':', -1);
        IF rnode= lnode_in_cedge OR rnode= rnode_in_cedge THEN
            BEGIN
            SET leaf= false;
            SET found= 2;
            END;
         END IF;
         SET eset  = REMOVE_FIRST(eset);
     END WHILE;
     END;
END IF;

SET eset  = REMOVE_FIRST(eset);
END WHILE;



IF found=1 THEN
SET leaf=true;
END IF;


END

如果有人发现上一个代码不起作用的原因,我可以通过破坏循环来使它起作用。 我对MySQL中的嵌套循环不太了解。 这是工作代码:

CREATE PROCEDURE `is_leaf`(IN `edge` VARCHAR(12), IN `eset` VARCHAR(512), OUT `leaf` INT)
BEGIN

declare lnode char(6) default substring_index(edge, ':', 1); -- left node of edge.
  declare rnode char(6) default substring_index(edge, ':', -1); -- right node of edge.
  declare cedge char(12);
  declare lnode_in_cedge char(6);
  declare rnode_in_cedge char(6);
  declare found int default 1;
  declare OGset varchar(512) default '';
  SET OGset= concat('',eset);

WHILE length(eset)!=0  DO
set cedge = substring_index(eset, ',', 1);
SET lnode_in_cedge= substring_index(cedge, ':', 1);
SET rnode_in_cedge= substring_index(cedge, ':', -1);
IF lnode= lnode_in_cedge OR lnode= rnode_in_cedge THEN
    set found=0;
END IF;

SET eset  = REMOVE_FIRST(eset);
END WHILE;

IF found=0 THEN
BEGIN
    SET eset= OGset;
    WHILE length(eset)!=0  DO
    set cedge = substring_index(eset, ',', 1);
    SET lnode_in_cedge= substring_index(cedge, ':', 1);
    SET rnode_in_cedge= substring_index(cedge, ':', -1);
        IF rnode= lnode_in_cedge OR rnode= rnode_in_cedge THEN
            BEGIN
            SET leaf= false;
            SET found= 2;
            END;
         END IF;
         SET eset  = REMOVE_FIRST(eset);
     END WHILE;
END;
END IF;


IF found!=2 THEN
SET leaf=true;
END IF;


END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM