2013-11-02 16 views
0


我已經爲藍本的工作和它在SQL表的依賴關係: 作業(ID,細節,exit_code) 依賴(JOB_ID,dependenet_job_id)MySQL查詢找到就業機會,依賴完成

例如:如果作業1取決於關於圖2和3,表將具有以下:
作業
1 「JOB1」 NULL
2 「JOB2」 NULL
3 「JOB3」 NULL
4 「作業4」 NULL

依賴

現在我需要找到可以在下一個運行的作業。在上面的情況下,2,3和4可以運行,因爲它們沒有任何依賴關係。 1只能在2和3成功完成(退出代碼= 0)時運行。

表可以有數百個作業和多級別的依賴關係。我有查詢使用左外連接獲得沒有依賴關係的作業。但是在找到依賴已成功完成的工作時遇到困難。

謝謝。

回答

0

對於「嵌套」的依賴關係(即JOB1依賴在job2上取決於job3),你需要一個遞歸查詢,MySQL不支持這樣的查詢。

你可以查看這篇關於如何reengineer your tables來處理遞歸的文章。

你可以做的另一件事是:

每當作業完成,它的依賴被刪除或禁用(你一個布爾列active添加到依賴表)

這樣,你就可以運行

SELECT jobs.* FROM jobs 
    LEFT JOIN depends ON (jobs.id = depends.parent_id AND depends.active = TRUE) 
    WHERE depends.child_id IS NULL 
      AND jobs.started = FALSE; 

這將返回尚未開始所有的工作,但沒有有效的依賴。

一旦你選擇了一份工作,你運行

UPDATE jobs SET started=TRUE WHERE id = @JOB_ID; 

,當它完成,

UPDATE jobs SET [email protected]_CODE WHERE id = @JOB_ID; 
UPDATE dependencies SET active = FALSE WHERE child_id = @JOB_ID; 
-- or 
DELETE FROM dependencies WHERE child_id = @JOB_ID; 
0

查詢的形式是「選擇工作那裏是沒有完成任何附屬作業」

Select 
    * 
from 
    jobs j 
where 
    not exists (
    select 
     'x' 
    from 
     dependencies d 
     inner join 
     jobs j2 
     on d.dependent_job_id = j2.id 
    where 
     j.id = d.job_id and (
     j2.exit_code is null or -- job hasn't completed successfully 
     j2.exit_code != 0 
    ) 
); 

Example SQLFiddle