在mysql中递归选择

时间:2014-12-10 05:02:16

标签: mysql sql

我有一张格式如下的表格

TaskID  ParentTaskID
1       1
2       1
3       2
4       2
5       2
10      10
11      11
12      11
13      0
14      14

如果taskid为1

,我想得到如下结果
TaskID
1
2
3
4
5

如果是2那么

Taskid
2
3
4
5

如果它是10然后10

表示我想选择具有taskid = 1的行,其行具有parenttaskid = 1 在上面的选择中有一些具有parenttaskid的行&所以........

请使用这个小提琴http://sqlfiddle.com/#!2/9db0c3/6

2 个答案:

答案 0 :(得分:1)

MySQL不支持递归选择。

但是,下面的查询应该是你正在寻找的技巧

SELECT t.TaskID
FROM task AS t
INNER JOIN (
    SELECT DISTINCT a.TaskID 
    FROM task AS a
    INNER JOIN (
        SELECT TaskID 
        FROM task
        WHERE TaskID = 11 OR ParentTaskID = 11
        UNION ALL
        SELECT ParentTaskID
        FROM task
        WHERE TaskID = 11 OR ParentTaskID = 11
    ) AS s ON s.TaskID = a.ParentTaskID
) AS s ON s.TaskID = t.TaskID

答案 1 :(得分:1)

正如迈克所说,MySQL不支持递归选择或递归函数。

如果您对任务连接有最大逻辑限制(如5),则可以使用硬编码自连接。

SELECT
t1.taskid as taskid1,
t2.taskid as taskid2,
t3.taskid as taskid3,
t4.taskid as taskid4,
t5.taskid as taskid5
FROM task t1
LEFT JOIN task t2 ON t2.parenttaskid = t1.taskid
LEFT JOIN task t3 ON t3.parenttaskid = t2.taskid
LEFT JOIN task t4 ON t4.parenttaskid = t3.taskid
LEFT JOIN task t5 ON t5.parenttaskid = t4.taskid

哪会产生这样的结果:http://sqlfiddle.com/#!2/c9f80/1/0

顺便说一句,你在输入数据中有一些自引用任务会产生一个递归的无限循环。