多対多の関係で条件に基づいてレコードをソートする SQL を書くことができません。tasks
タスクの依存関係のための多対多のテーブルを持つテーブル構造があります。たとえば、タスク C は、テーブルを介して他のタスクに 1 つまたは複数の依存関係を持つことができますtask_dependencies
。
- タスク: id、user_id、status_id、date_due、...
- TASK_DEPENDENCIES: task_id、dependency_task_id (ピボット テーブル)
- ステータスは次のとおりです: Q-新規、G-進行中、L-閉鎖
タスクの依存関係の考え方は、すべての依存関係のタスクが閉じられるまで、1 つのタスクを開始できないというものです。すべてのユーザーの開いているタスクを選択したいと思います。かんたんだよ。しかし、date_due で並べ替える必要がありますが、結果セットの最後にまだ開始できない依存関係を持つすべてのタスクがあります。つまり、すべての依存関係タスクが閉じているかどうかを何らかの方法で確認し、何らかの方法で並べ替えるときにこれを考慮する必要がありますか?
なんとか 1 つの選択をまとめることができましたが、これにより、依存関係を持つすべてのタスクが常にレコード セットの最後に配置されます。しかし、閉じた依存関係を持つタスクを通常の date_due 注文フローに入れたい...
SELECT
T.id, T.description, TD.dependency_task_id,
ISNULL(TD.dependency_task_id) AS NoDependency, T.date_due
FROM tasks T
LEFT OUTER JOIN task_dependencies TD
ON T.id = TD.task_id
WHERE assigned_user_id=1
ORDER BY NoDependency DESC, T.date_due
ここに SQL フィドルがあります: http://sqlfiddle.com/#!2/894f7/3。