mysql - 如何在 MySQL 中进行递归 SELECT 查询?

标签 mysql sql query-optimization recursive-query

我得到了下表:

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

如果用户搜索“1”,程序将查找包含“1”的 col1,然后在 col3 中获取值“5”,那么程序将继续在col1中搜索“5”,并在col3中找到“3”,依此类推。所以它会打印出:

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

我们使用临时表来存储输出结果,并且由于临时表是基于 session 的,因此不会出现任何有关输出数据不正确的问题。

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

<罢工>

Note
parent_id value should be less than the child_id for this solution to work.

关于mysql - 如何在 MySQL 中进行递归 SELECT 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49267320/

相关文章:

php - 优化和美化php中又长又丑的sql查询

php - 具有多个计数的选项卡导航栏

php - 如何使用行数据用 PHP 解析 MySQL 表的结果?

sql - 镜像与复制

sql - MySQL 嵌套聚合查询,选择特定的中间项

mysql - 我应该用什么代替 IN?

mysql - 优化包含 WHERE 和 ORDER BY 的 MySQL UPDATE 查询?

mysql - 如何导入最新的数据库备份文件到备份服务器

java - 使用 Spring JPA 将阿拉伯语文本保存到 mysql

sql - 在sys.servers中找不到服务器 'dbo'。