タスクが他のタスクに依存できる「タスクマネージャー」テーブル構造を設計する必要があります。たとえば、次のタスクを実行できます。
TASK A: independent
TASK B: independent
TASK C: can not start before TASK B is finished
TASK D: independenet
TESK E: can not start before TASK C and TASK E are finished
各タスクには、標準のプロパティ (started_by、assigned_to、due_date、description、status) があります。このクエリを簡単に実行できるテーブル構造が必要です。
- すべてのユーザーの開いているタスクを選択しますが、既に開始できるタスクのみを選択します (つまり、上記のシナリオでは、タスク C と E は、依存関係のタスクが完了するまでここでは選択できません)。
現在、私の解決策は2つのテーブルを持つことです:
- tasks: タスク レコードを保持するテーブル
- task_dependencies: タスク間の依存関係 (id、task_id、dependent_task_id) を保持するテーブル
上記のシナリオの現在のクエリと現在のテーブル構造は次のようになります。
SELECT description, from_unixtime( date_due )
FROM tasks
WHERE
assigned_user_id = 751
AND status_id = 'Q'
AND id NOT
IN (
SELECT TD.task_id
FROM task_dependencies TD
INNER JOIN tasks T ON TD.dependent_task_id = T.id
AND T.status_id = 'Q')
ORDER BY date_due
-- status 'Q' = new uncompleted task
これで正しい結果が得られましたが、これは正しい方法ですか、それともテーブル構造やクエリを改善する必要がありますか?
上記のシナリオのSQL フィドルもあります。