【问题标题】:Mysql Chain Select QueryMysql链选查询
【发布时间】:2012-12-17 11:48:12
【问题描述】:

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

Root   |   Connector
  A    |      B
  B    |      C
  C    |      D
  D    |      E
  E    |      -

所以我想检索任何给定根的链,直到连接器为空

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

我正在使用mysql数据库。

提前致谢

【问题讨论】:

  • 你使用什么编程语言?

标签: mysql database


【解决方案1】:

我只是尝试在 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

【讨论】:

    【解决方案2】:

    由于 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 以外的编程语言构建链。

    【讨论】:

    • Hi Husni...我确实创建了这个存储过程,但我无法执行这些命令:SET max_sp_recursion_depth = 255;调用 build_chain('a');
    猜你喜欢
    • 2014-03-13
    • 2021-12-22
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2014-09-11
    • 2021-10-14
    相关资源
    最近更新 更多