1

私はこのようなテーブルを持つデータベースを持っています:

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

したがって、コネクタが空白になるまで、任意のルートのチェーンを取得したい

例:チェーンオブAはa-> B-> C-> D-> Eを意味し、チェーンオブCはC->D->Eを意味します

私はmysqlデータベースを使用しています。

前もって感謝します

4

2 に答える 2

3

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
于 2012-12-21T16:27:15.027 に答える
1

MySQLではユーザーが再帰関数を作成できないため、ストアドプロシージャを使用して説明します。

作業中のテーブルの名前が「テスト」であると仮定します。

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以外のプログラミング言語を使用してチェーンを構築することもできます。

于 2012-12-17T14:50:21.023 に答える