如何在MySQL中进行递归选择查询?

如何在MySQL中进行递归选择查询?

我有一个下表:


col1 | col2 | col3

-----+------+-------

1    | a    | 5

5    | d    | 3

3    | k    | 7

6    | o    | 2

2    | 0    | 8

如果用户搜索“1”,程序将查看col1中有“1”的值。col3“5”,则程序将继续在col1它会有“3”col3等等。所以它会打印出来:


1   | a   | 5

5   | d   | 3

3   | k   | 7

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


6   | o   | 2

2   | 0   | 8

如何构建一个SELECT查询来做这个吗?


MYYA
浏览 692回答 3
3回答

波斯汪

编辑@leftclickben提到的解决方案也是有效的。我们也可以使用相同的存储过程。CREATE&nbsp;PROCEDURE&nbsp;get_tree(IN&nbsp;id&nbsp;int) &nbsp;BEGIN &nbsp;DECLARE&nbsp;child_id&nbsp;int; &nbsp;DECLARE&nbsp;prev_id&nbsp;int; &nbsp;SET&nbsp;prev_id&nbsp;=&nbsp;id; &nbsp;SET&nbsp;child_id=0; &nbsp;SELECT&nbsp;col3&nbsp;into&nbsp;child_id&nbsp; &nbsp;FROM&nbsp;table1&nbsp;WHERE&nbsp;col1=id&nbsp;; &nbsp;create&nbsp;TEMPORARY&nbsp;&nbsp;table&nbsp;IF&nbsp;NOT&nbsp;EXISTS&nbsp;temp_table&nbsp;as&nbsp;(select&nbsp;*&nbsp;from&nbsp;table1&nbsp;where&nbsp;1=0); &nbsp;truncate&nbsp;table&nbsp;temp_table; &nbsp;WHILE&nbsp;child_id&nbsp;<>&nbsp;0&nbsp;DO&nbsp;&nbsp;&nbsp;insert&nbsp;into&nbsp;temp_table&nbsp;select&nbsp;*&nbsp;from&nbsp;table1&nbsp;WHERE&nbsp;col1=prev_id; &nbsp;&nbsp;&nbsp;SET&nbsp;prev_id&nbsp;=&nbsp;child_id; &nbsp;&nbsp;&nbsp;SET&nbsp;child_id=0; &nbsp;&nbsp;&nbsp;SELECT&nbsp;col3&nbsp;into&nbsp;child_id&nbsp;&nbsp;&nbsp;FROM&nbsp;TABLE1&nbsp;WHERE&nbsp;col1=prev_id; &nbsp;END&nbsp;WHILE; &nbsp;select&nbsp;*&nbsp;from&nbsp;temp_table; &nbsp;END&nbsp;//我们使用临时表来存储输出的结果,而由于临时表是基于会话的,所以输出数据不正确将不会出现任何问题。SQL FIDDLE Demo&nbsp;

至尊宝的传说

Leftclickben的答案对我有效,但我想要一条从给定节点到树根的路径,而这些路径似乎是相反的,沿着树向下。所以,为了清晰起见,我不得不翻转一些字段并重新命名,这对我很有用,以防这也是其他人想要的-item | parent-------------1&nbsp; &nbsp; | null2&nbsp; &nbsp; | 13&nbsp; &nbsp; | 14&nbsp; &nbsp; | 25&nbsp; &nbsp; | 46&nbsp; &nbsp; | 3和select t.item_id as item_id, @pv:=t.parent as parentfrom (select * from item_tree order by item_id desc) tjoin(select @pv:=6)tmpwhere t.item_id=@pv;给予:item | parent-------------6&nbsp; &nbsp; | 33&nbsp; &nbsp; | 11&nbsp; &nbsp; | null
打开App,查看更多内容
随时随地看视频慕课网APP