从一个表中进行MySQL递归选择

时间:2016-02-05 13:08:32

标签: mysql recursion

我在MySQL中有这个表:

| id | mainid | name                |
+----+--------+---------------------+
| 1  | 0      | main 1              |
| 2  | 1      | sub 1               |
| 3  | 1      | sub 2               |
| 4  | 1      | sub 3               |
| 5  | 4      | subsub 1            |
| 6  | 4      | subsub 2            |
| 7  | 0      | main 2              |
| 8  | 7      | sub 4               |
| 9  | 7      | sub 5               |

mainid字段与id字段相关联。

MySQL命令中是否有最佳实践选择所有行递归?我想select主要项目下的所有子项目。

我尝试在第一级选择所有子项,例如sub 1,sub 2,sub3在main 1下。这很简单:

SELECT id, mainid, name FROM mytable WHERE mainid = '1';

但是有一个单行命令来选择相同的行以及subsub1和subsub 2行吗? (如果我创造另一个更深层次的话,那就更好了。)

1 个答案:

答案 0 :(得分:0)

您需要临时表和单独的存储过程

第一个存储过程将收到" parent" id并创建一个结果临时表:

结果(id,mainid,名称)

和检查临时表

检查(id,通过) (这个表是避免无限循环的必要条件)

所以,想法是你调用内部存储过程,内部存储就像这样

PROC(currentId(int))

使用父ID和proc将基本上执行查询所做的操作,但将其保存在内部临时表中,然后对于该临时表的每个元素(不在CHECK中),它将标记为传入检查(只是插入行)并为每个"孩子"调用相同的proc。 of currentId

然后将内部临时表中的所有数据插入到RESULT中,您将拥有整个后代列表

你有两种方式

检查子项然后插入RESULT 要么 插入RESULT然后检查孩子

数据的排序方式不同,但结果应该相同