1

ユーザーが完了する必要があるタスクで満たされたテーブルがあります。タスク A が完了するまでタスク B を開始できないため、テーブルは次のようになります。

taskID   |   jobID   |   assignedTo   |   taskName   |   completedTime
----------------------------------------------------------------------
1               1           Carl            blah 1          11235512
2               1           Mike            blah 2          13578423
3               1           Steve           blah 3          0
4               2           Alex            blah 4          12481235
5               2           Chris           blah 5          0
6               2           Steve           blah 6          0

Steve を見て、job 1 - taskid 3 エントリを選択したいと思います。なぜなら、彼の前にある (同じジョブ内の) すべてのタスクが完了し、そのジョブのタスクを実行する時が来たからです。ただし、Chris はジョブ 2 - taskid 5 を完了していないため、Steve のジョブ 2 - taskid 6 は選択したくありません。

1回のクエリでこれを行う方法はありますか? それとも、Steve のすべてのタスクのリストを取得してから、それぞれをループして、completedTime が 0 の各ジョブの最小の taskID であることを確認する必要がありますか?

4

2 に答える 2

3
SELECT
nowtable.* -- or whatever fields you want
FROM yourtable AS nowtable
LEFT JOIN yourtable AS beforetable
  ON nowtable.jobID=beforetable.jobID 
  AND beforetable.taskID<nowtable.taskID
WHERE nowtable.assignedTo="Steve"
GROUP BY nowtable.taskID
HAVING IFNULL(COUNT(beforetable.taskID),0)=0
于 2012-09-06T19:06:33.617 に答える
1

タスクは常に順番に追加されますか? 現在のところ、タスク ID 1 と 2 が 3 より前に完了する必要があることを伝える方法は、タスク ID 以外にありません。

select top 1 *
from tblTasks 
where completedTime = 0 
 and jobID = (select top 1 jobid from tblTasks where assignedTo = @username and completedTime = 0 order by jobID)
 and assignedTo = @username
 order by taskID;
于 2012-09-06T19:13:03.517 に答える