1. ホーム
  2. mysql

[解決済み] MySQLで再帰的SELECTクエリを行うには?

2023-07-01 08:32:46

質問

以下のような表ができました。

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

ユーザーが "1" を検索した場合、プログラムは col1 にある値を取得します。 col3 にある値を取得します。 col1 で "3"を取得します。 col3 などと表示されます。それでプリントアウトされます。

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

ユーザーが "6"を検索すると、出力されます。

6   | o   | 2
2   | 0   | 8

を構築する方法 SELECT クエリを作成するにはどうしたらよいでしょうか?

どのように解決するには?

編集

左クリックベンさん(@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 よりも小さい必要があります。