当前位置: 首页 > 面试题库 >

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

宗建章
2023-03-14
问题内容

我得到一张下表:

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查询来做到这一点?


问题答案:

编辑

@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于此解决方案的。



 类似资料:
  • 如何构建查询来实现这一点?

  • 问题内容: 如何在MySql中运行此查询? 它会显示如下错误消息: 问题答案: 该语句/方法适用于PostgreSQL和Sybase(我想可能还有更多),所以也许您可以看一下: http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html 它应该向您展示一些使用MySQL的方法(以及PHP中的一两个方法,我只知道它不在您的标签列

  • 问题内容: 关于Mysql中的递归SELECT查询有很多问题,但是大多数答案是“ Mysql中没有递归SELECT查询的解决方案”。 其实有一定的解决方案,我想清楚地知道,所以这个问题是可以在(how-to-do-the-cursive-select-query-in- mysql )中找到的先前问题的以下内容 假设您有此表: &您想在col1中找到所有连接到值“ 1”的链接,即您要打印出: 然后

  • 问题内容: 我有一组按层次结构组织的数据,应该可以增长到任意大小。我需要检索整个树,但是我无法弄清楚如何仅使用SQL来完成。我当前的解决方案是创建一个临时表,并使用递归函数依次查询树的分支,然后将结果存储在临时表中,随后我再次对其进行查询以产生所需的结果。 我的问题是,从本质上讲,我正在执行的联接正确吗?构造一个中间表,然后查询结果。似乎应该有一种使用联接的方法,但是MySQL文档仅涵盖检索有限深

  • 在我正在进行的理解DNS的实验中,我试图理解名称服务器如何进行递归查询。我得到了基本的想法-你从一个顶级dns服务器开始,然后它向你发送一个要联系的权威名称服务器列表,然后你联系这些服务器,等等,直到你得到一个权威的响应。 听起来很简单。 但当我在实践中尝试时,我在第一步后就卡住了。我只是使用命令行工具手动执行此操作-(我确保关闭递归) 好的,那么第1步:从根名称服务器开始。我从维基百科的根名称服

  • 问题内容: 我想选择一个根项,它是尽可能多的孩子。我更喜欢使用嵌套集模型,但是这次表结构遵循 邻接模型 。有关嵌套集和邻接模型的更多信息。 我有一个,一个。 依赖表 项目表 SQL,先尝试 我需要此SELECT递归。 所需的输出 这种情况应该很常见,但是我想知道我现在找不到最佳实践。请注意:它是MySQL,所以我 无法使用CTE ! 您将如何解决这个问题?提前致谢! 问题答案: 作为NoSQL人员