2012-09-06 2 views
1

사용자가 완료해야하는 작업으로 가득 찬 테이블이 있습니다. 작업 A가 완료 될 때까지 작업 B 시작할 수 없습니다, 그래서 내 테이블은 다음과 같이 보입니다 :mySQL - 이전 레코드 값을 기반으로 레코드를 선택할 수 있습니까?

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 

스티브을 살펴보면, 내가 한 일을 선택하려는 것 - TASKID 3 항목을하기 때문에 모든 작업 (같은 일을하는 동안) 그 일이 끝나기 전에 그의 일을 할 시간이되었습니다. 크리스는 작업이 완료되지 않았기 때문에 스티브에 대한 TASKID 6 - - TASKID 5.

을 하나 개의 쿼리에서이 작업을 수행 할 수있는 방법이 있나요 그러나, 나는 작업 2를 선택하고 싶지 않아요? 아니면 Steve의 모든 작업 목록을 가져온 다음 각 작업을 반복하고 completedTime이 0 인 각 작업에 대해 가장 낮은 taskID인지 확인해야합니까?

+0

사용자 정의 기능에서 항상이를 수행 할 수있는 방법이 있습니다. 하지만 스티브에 대한 모든 작업을 jobId별로 그룹화 한 네이티브 쿼리를 원한다고 가정합니다. 여기에서 taskID는이 작업의 가장 높은 taskID보다 1 높고 0이 아닌 completedTime이 있습니다. –

+0

[subquery] (http://dev.mysql.com/doc/refman/5.0/en/subqueries.html) 또는 전통적인'JOIN'이이를 수행하는 일반적인 방법 일 것입니다. –

답변

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 
1

작업이 항상 순서대로 추가됩니까? 현재 taskID1과 2가 3보다 먼저 완료되어야 함을 알려주는 taskID 이외의 방법은 없습니다.

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; 
+0

예, 작업이 생성되면 모든 작업이 데이터베이스에 순차적으로 채워집니다. – Brds

+0

나에게 단지 1 개의 결과 (즉, "1 위")를 제공하지 않을까요? 이론적으로 사용자는 행동 옆에 무제한의 작업을 수행 할 수 없습니다. – Brds

관련 문제