获得任务叶

时间:2016-03-11 11:36:24

标签: mysql

使用MySQL,我想在表格中返回一个任务列表,如下所示

ID  |  ID_TASK_PARENT  | TASK_NAME
---------------------------------------------
 1  |            NULL  | task level 1
 2  |               1  | task child level 2
 3  |               2  | task child level 3
 4  |            NULL  | task level 1
 5  |               4  | task child level 2
 6  |               5  | task child level 3
 7  |               5  | task child level 3

现在,一个查询可以从父任务ID中获取所有叶子任务的ID吗?

示例:

ID = 1 --> result ID 3

ID = 4 --> result ID 6,7

非常感谢你!

2 个答案:

答案 0 :(得分:0)

如果您总是有三个级别的嵌套,并且您只想在输出中使用第三级,则可以使用:

select one.id,three.id 
from leaves one 
join leaves two 
on one.id=two.id_task_parent 
join leaves three
on two.id = three.id_task_parent;

这假设您的表被调用"离开"。它的工作方式是使用id< - > id_task_parent进行两次自连接。但是如果你想报告二级或三级以下的叶子,它就不会起作用,因为需要单独告知mysql每个连接。

答案 1 :(得分:0)

我很害怕没有好的单一查询做你想做的事。

我建议使用存储过程执行此任务,使用临时表和循环(如果您希望我可以建议这样的过程),或者修改一下任务表。

如果有可能添加ID_TASK_ROOT:

ID  |  ID_TASK_PARENT  | ID_TASK_ROOT | TASK_NAME
-------------------------------------------------------------
 1  |            NULL  |            1 | task level 1
 2  |               1  |            1 | task child level 2
 3  |               2  |            1 | task child level 3
 4  |            NULL  |            4 | task level 1
 5  |               4  |            4 | task child level 2
 6  |               5  |            4 | task child level 3
 7  |               5  |            4 | task child level 3

然后你可以使用查询:

SELECT      t1.ID
    FROM    tasks t1
LEFT JOIN   tasks t2
        ON  t2.ID_TASK_PARENT = t1.ID
    WHERE   t2.ID IS NULL
        AND t1.ID_TASK_ROOT = ?;