Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql链选择查询_Mysql_Database - Fatal编程技术网

Mysql链选择查询

Mysql链选择查询,mysql,database,Mysql,Database,我有一个数据库,其中有一个表,看起来有点像这样: Root | Connector A | B B | C C | D D | E E | - 所以我想检索任何给定根的链,直到连接器为空 例如:A链表示A->B->C->D->E,而C链表示C->D->E 我正在使用mysql数据库 提前感谢由于MySQL不允许用户创建递归函数,让我向您展示如何使用存储过程: 假设您正在处理的表名为tes

我有一个数据库,其中有一个表,看起来有点像这样:

Root   |   Connector
  A    |      B
  B    |      C
  C    |      D
  D    |      E
  E    |      -
所以我想检索任何给定根的链,直到连接器为空

例如:A链表示A->B->C->D->E,而C链表示C->D->E

我正在使用mysql数据库


提前感谢

由于MySQL不允许用户创建递归函数,让我向您展示如何使用存储过程:

假设您正在处理的表名为test

DELIMITER $$

DROP PROCEDURE IF EXISTS build_chain$$
CREATE PROCEDURE build_chain(init CHAR(1))
BEGIN
    IF init != '-' THEN
        SET @r := (SELECT DISTINCT(root) FROM test WHERE root = init);
        SET @search_type := TRUE;
        SET @result := @r;
    END IF;

    SET @r := (SELECT DISTINCT(connector) FROM test WHERE root = @r AND connector != '-');
    SET @result = CONCAT_WS('->', @result, @r);
    SET @search_type = IF(@search_type, FALSE, TRUE);
    IF @r IS NOT NULL THEN CALL build_chain('-'); ELSE SELECT @result AS result_chain; END IF;

END$$

DELIMITER ;
用法:

SET max_sp_recursion_depth = 255;
CALL build_chain('a');
结果链存储在@Result变量中


注意:您也可以使用MySQL以外的编程语言来构建链。

由于MySQL不允许用户创建递归函数,所以让我向您展示如何使用存储过程:

假设您正在处理的表名为test

DELIMITER $$

DROP PROCEDURE IF EXISTS build_chain$$
CREATE PROCEDURE build_chain(init CHAR(1))
BEGIN
    IF init != '-' THEN
        SET @r := (SELECT DISTINCT(root) FROM test WHERE root = init);
        SET @search_type := TRUE;
        SET @result := @r;
    END IF;

    SET @r := (SELECT DISTINCT(connector) FROM test WHERE root = @r AND connector != '-');
    SET @result = CONCAT_WS('->', @result, @r);
    SET @search_type = IF(@search_type, FALSE, TRUE);
    IF @r IS NOT NULL THEN CALL build_chain('-'); ELSE SELECT @result AS result_chain; END IF;

END$$

DELIMITER ;
用法:

SET max_sp_recursion_depth = 255;
CALL build_chain('a');
结果链存储在@Result变量中


注意:您也可以使用MySQL以外的编程语言构建链。

我只是尝试了MySQL中的循环结构,并获得了成功。仅发布到共享-

CREATE PROCEDURE `root_connect`(IN init char(1),OUT str char(15))
BEGIN
    set @startChar:=(select connector from tableName where root = init);
    set @endloop := "no";
    set @fullchar:= @startChar;
    set @newchar:= "";  
    if (@startChar !="-" OR @startChar =null) then 
        WHILE (@endloop = "no") DO                  
            set @newchar :=(select connector from tableName where root = @startChar);       
            if(@newchar = '-') THEN
                set @endloop := "yes";
            else
                set @fullchar:= concat(@fullchar,"-",@newchar);
            end if;         
            set @startChar := @newchar;     
        END WHILE;
    end if;
        select @fullchar;
END

我刚刚尝试了Mysql中的循环结构,并获得了成功。仅发布到共享-

CREATE PROCEDURE `root_connect`(IN init char(1),OUT str char(15))
BEGIN
    set @startChar:=(select connector from tableName where root = init);
    set @endloop := "no";
    set @fullchar:= @startChar;
    set @newchar:= "";  
    if (@startChar !="-" OR @startChar =null) then 
        WHILE (@endloop = "no") DO                  
            set @newchar :=(select connector from tableName where root = @startChar);       
            if(@newchar = '-') THEN
                set @endloop := "yes";
            else
                set @fullchar:= concat(@fullchar,"-",@newchar);
            end if;         
            set @startChar := @newchar;     
        END WHILE;
    end if;
        select @fullchar;
END

你在用什么编程语言?你在用什么编程语言。。。我确实创建了这个存储过程,但我无法执行以下命令:SET max\u sp\u recursion\u depth=255;称构建链为“a”;嗨,胡斯尼。。。我确实创建了这个存储过程,但我无法执行以下命令:SET max\u sp\u recursion\u depth=255;称构建链为“a”;