80

次の表を取得しました。

col1 | col2 | col3
-----+------+-------
1    | a    | 5
5    | d    | 3
3    | k    | 7
6    | o    | 2
2    | 0    | 8

ユーザーが「1」を検索すると、プログラムcol1は「1」を持つものを調べ、「5」の値を取得しますcol3。その後、プログラムは「5」を検索し続け、col1「3」を取得します。col3など。したがって、次のように出力されます。

1   | a   | 5
5   | d   | 3
3   | k   | 7

ユーザーが「6」を検索すると、次のように出力されます。

6   | o   | 2
2   | 0   | 8

それを行うためのクエリを作成する方法SELECTは?

4

6 に答える 6

70

編集

@leftclickben が言及した解決策も効果的です。同じためにストアドプロシージャを使用することもできます。

CREATE PROCEDURE get_tree(IN id int)
 BEGIN
 DECLARE child_id int;
 DECLARE prev_id int;
 SET prev_id = id;
 SET child_id=0;
 SELECT col3 into child_id 
 FROM table1 WHERE col1=id ;
 create TEMPORARY  table IF NOT EXISTS temp_table as (select * from table1 where 1=0);
 truncate table temp_table;
 WHILE child_id <> 0 DO
   insert into temp_table select * from table1 WHERE col1=prev_id;
   SET prev_id = child_id;
   SET child_id=0;
   SELECT col3 into child_id
   FROM TABLE1 WHERE col1=prev_id;
 END WHILE;
 select * from temp_table;
 END //

出力の結果を保存するために一時テーブルを使用しています。一時テーブルはセッション ベースであるため、出力データが正しくないという問題はありません。

SQL FIDDLE Demo

このクエリを試してください:

SELECT 
    col1, col2, @pv := col3 as 'col3' 
FROM 
    table1
JOIN 
    (SELECT @pv := 1) tmp
WHERE 
    col1 = @pv

SQL FIDDLE Demo:

| COL1 | COL2 | COL3 |
+------+------+------+
|    1 |    a |    5 |
|    5 |    d |    3 |
|    3 |    k |    7 |

このソリューションが機能するに
parent_idは、値が よりも小さいことに注意してください。child_id

于 2013-05-13T03:21:46.323 に答える
52

@Meherzad によって受け入れられた回答は、データが特定の順序である場合にのみ機能します。OPの質問からのデータを扱うことが起こります。私の場合、自分のデータで動作するように変更する必要がありました。

注:これは、すべてのレコードの「id」(問題の col1) の値が、そのレコードの「親 ID」(問題の col3) より大きい場合にのみ機能します。通常、親を最初に作成する必要があるため、これはよくあることです。ただし、アプリケーションが階層の変更を許可している場合、アイテムの親が別の場所に変更される可能性がある場合、これに依存することはできません。

これは、誰かを助ける場合の私の質問です。データが上記の必要な構造に従っていないため、特定の質問では機能しないことに注意してください。

select t.col1, t.col2, @pv := t.col3 col3
from (select * from table1 order by col1 desc) t
join (select @pv := 1) tmp
where t.col1 = @pv

違いは、親がその後になるようtable1に順序付けされていることです (親の値が子の値よりも低いため)。col1col1

于 2014-07-23T04:30:48.480 に答える
9

ストアド プロシージャは、それを行うための最良の方法です。Meherzad のソリューションは、データが同じ順序に従う場合にのみ機能するためです。

このようなテーブル構造がある場合

col1 | col2 | col3
-----+------+------
 3   | k    | 7
 5   | d    | 3
 1   | a    | 5
 6   | o    | 2
 2   | 0    | 8

うまくいきません。SQL Fiddle Demo

これを実現するためのサンプル プロシージャ コードを次に示します。

delimiter //
CREATE PROCEDURE chainReaction 
(
    in inputNo int
) 
BEGIN 
    declare final_id int default NULL;
    SELECT col3 
    INTO final_id 
    FROM table1
    WHERE col1 = inputNo;
    IF( final_id is not null) THEN
        INSERT INTO results(SELECT col1, col2, col3 FROM table1 WHERE col1 = inputNo);
        CALL chainReaction(final_id);   
    end if;
END//
delimiter ;

call chainReaction(1);
SELECT * FROM results;
DROP TABLE if exists results;
于 2014-01-27T10:37:52.920 に答える