2012-12-17 6 views
1

У меня есть база данных с таблицей, которая выглядит примерно так:Mysql Chain Select Query

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

Так я хочу, чтобы получить цепочку для любого заданного корня до разъема пустого

Например: Цепь A означает a-> B-> C-> D-> E, тогда как цепочка C означает C-> D-> E

Я использую базу данных mysql.

Заранее спасибо

+1

Какой язык программирования вы используете? –

ответ

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 
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.

+0

Hi Husni ... Я создал эту процедуру хранения, но я не могу выполнить эти команды: SET max_sp_recursion_depth = 255; CALL build_chain ('a'); –

+0

Работал как шарм ... спасибо :) –