一尘不染

如何在MySQL中执行递归SELECT查询?

mysql

我得到一张下表:

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

如果用户搜索“ 1”,则程序将查看col1具有“ 1”的,然后它将在col3“ 5”中得到一个值,然后程序将继续在其中搜索“
5”,col1并且将得到“ 3”在中col3,依此类推。因此它将打印出:

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

如果用户搜索“ 6”,它将打印出:

6   | o   | 2
2   | 0   | 8

如何建立一个SELECT查询来做到这一点?


阅读 310

收藏
2020-05-17

共1个答案

一尘不染

编辑

@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](http://sqlfiddle.com/#!2/9635d2/1)**

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

注释
parent_id值应小child_id于此解决方案的。

2020-05-17