我有一张格式如下的表格
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的行&所以........
答案 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
顺便说一句,你在输入数据中有一些自引用任务会产生一个递归的无限循环。