2012-05-14 5 views
0

[참고로, 이것은 숙제가 아닙니다. — 간단한 질문 형식으로 내 질문의 형식을 지정하기 때문에 모든 사람들이 그렇게 생각한다고 생각하십니까? 다시, 숙제가 아닙니다. 나는 직장에서 공부하려고 노력하고 있습니다. 고마워.]이 까다로운 SQL 쿼리는 어떻게 작성합니까?

나는 까다 롭습니다. 저는 Java 녀석입니다. 저는 SQL 녀석이 아니기 때문에 어떤 도움이든지 대단히 감사합니다!

는 그래서 같은 PROJECT 테이블과 작업 테이블이 : 예를 들어

**TASK** 
taskId 
projectId 
description 
userId // the user who is assigned the task 
status // either "IN_PROGRESS" or "COMPLETE" 
sequence // the numeric sequence of the TASK in the PROJECT 

:

Project 
    projectId=100 
    name="Build House" 
Task 
    taskId=250 // task IDs are not necessary in numerical order 
    sequence=1 
    description="Pour Foundation" 
    userId=55 
    status="COMPLETE" 
Task 
    taskId=240 
    sequence=2 
    description="Build walls" 
    userId=56 
    status="COMPLETE" 
Task 
    taskId=260 
    sequence=3 
    description="Install windows" 
    userId=57 
    status="IN_PROGRESS" 
Task 
    taskId=245 
    sequence=4 
    description="Build roof" 
    userId=58 
    status="IN_PROGRESS" 

나는 두 개의 쿼리가 필요

**PROJECT** 
projectId 
name 

프로젝트는 많은 작업이 있습니다 :

(1) 주어진 projectId, '현재 작업'을 가져옵니다. 현재 작업은 완료되지 않은 번호가 가장 작은 sequence 번호의 작업 번호입니다. 내 예에서는 getCurrentTask(projectId=100)이 taskId 260을 반환합니다 (처음에는 불완전합니다).

(2) 주어진 사용자 ID에 대해 '현재 작업'에 할당 된 프로젝트 목록을 가져옵니다. 내 예에서 getProjectsForUserId(userId=57)은 projectId 100을 반환합니다. getProjectsForUserId(userId=58)은 아무 것도 반환하지 않습니다.

+0

내부 조인 및 집계 함수에 대해 배우기 만하면됩니다. –

+1

당신의 예제가 나에게 잘못된 것 : 나는 getProjectsForUserId (58)가 반환해야하는 이유를 모르겠다. 정교한 케어? – DocJones

+1

@DocJones - getProjectsForUserId (58)는 userId 58이 '현재 작업'에 할당되지 않았기 때문에 아무 것도 반환하지 않습니다. 작업 "설치 창"이 현재 작업입니다. 시스템이 작동하는 방식은 사용자 58이 "Windows 설치"가 완료된 후 "지붕 만들기"작업을 시작할 수 있다는 것입니다. 감사. –

답변

5
SELECT min(taskID) FROM Task WHERE ProjectID = ? and status <> "COMPLETE"; 

SELECT projectID FROM 
Tasks T INNER JOIN 
(SELECT min(taskID) as taskID, projectID FROM Task GROUP BY projectID WHERE status <> "COMPLETE") 
AS CT on CT.taskID = T.taskID 
WHERE T.userId = ?' 

EDIT TaskID를 대신하여 시퀀스 순서 아래

쿼리.

SELECT taskID from Task T INNER JOIN 
(SELECT min(sequence) as sequence, projectID FROM Task GROUP BY projectID WHERE status <> "COMPLETE") 
    AS CT on CT.sequence = T.sequence AND CT.projectID = T.projectID 
WHERE T.projectID = ?; 

SELECT projectID FROM 
Task T INNER JOIN 
(SELECT min(sequence) as sequence, projectID FROM Task GROUP BY projectID WHERE status <> "COMPLETE") 
    AS CT on CT.sequence = T.sequence AND CT.projectID = T.projectID 
WHERE T.userID = ?; 
+1

taskID를 숫자 순서대로 계산할 수 없습니다 (프로젝트가 시작되기 전에 모두 만들어지고 순서가 정해져 있기 때문에). 그래서 일련 번호가있는 것입니다. 시퀀스 번호를 고려하여 쿼리를 어떻게 조정할 수 있습니까? –

1
SELECT * FROM TASK 
LEFT OUTER JOIN PROJECT ON 
    TASK.PROJECTID=PROJECT.PROJECTID 
WHERE TASK.STATUS='IN_PROGRESS' 
    AND PROJECT.PROJECTID=? 
ORDER BY SEQUENCE ASC 
+0

질문이 있습니다 - 왜 내 대답을 아직 끝내지 않았습니까? – DocJones

+0

죄송합니다. 숙제가 아닌 것 같습니다. 진행하시기 바랍니다. – krlmlr

+1

Grrr ... 우연이 아닙니다! 오늘 stackoverflow에 무슨 문제가 있습니까? 나는 여기서 일을 끝내려고 노력하고있어. –

1

먼저 쿼리 (업데이트)

SELECT taskId FROM `task` 
WHERE `projectId`=100 AND `status` = "IN_PROGRESS" 
ORDER BY `sequence` 
LIMIT 1 

번째 :

SELECT DISTINCT(projectId) FROM task 
WHERE userId=57 AND `status` = "IN_PROGRESS" 
ORDER BY `sequence` 

을 P.S. 프로젝트 테이블에 조인을 추가하지 않았습니다. 작업에 ID에 대해서만 물었 기 때문입니다. 이 숙제가 있다면

+0

그렇게 간단하지가 않습니다. 일련 번호에 대해 빠뜨린 것 같아요? 나는 단지 'IN_PROGRESS'인 사용자의 모든 작업이 아니라 'IN_PROGRESS'인 숫자 순서로 첫 번째 작업을 원합니다. –

+1

흠. 쿼리 끝에 "LIMIT 1"을 추가하면 작동합니다. 이제 두 번째 작업을 이해했습니다. 한 순간 :) – avasin

+1

당신은 주문 (다음 작업을 수행한다는 가정하에)이 필요합니다. – DocJones

1

, 나는이 힌트를 줄 것입니다 :

(1) : Tasks을 통해 간단한 쿼리 할 것입니다. (프로젝트 ID를 알지?) 집계 함수와 WHERE 절을 사용하십시오.

(2) WHERE EXISTS ... 구성을 사용하여 Projects을 시도해보십시오. DISTINCT도 유용 할 수 있습니다.

편집 : 두 번째 쿼리에도 Projects을 터치 할 필요가 없습니다. @true가 게시 한 쿼리가 올바르게 보입니다.

EDIT^2 : ... 그러나 @ true 쿼리는 "현재"작업에만 관심이 있다는 미묘 함을 고려하지 않습니다.

+0

도움을 주셔서 감사합니다.하지만 숙제가 아닙니다. 저는 매우 기본적인 SQL 지식을 가진 전문적인 자바 프로그래머입니다. 나는 언젠가 당신이 복잡한 자바 문제에 얽매이지 않기를 바래서 당신의 문제를 '힌트'로 과소 평가할 수 있기를 바랍니다. ;) –

+1

그럼'숙제 '태그는 왜? – krlmlr

+0

숙제 태그를 추가하지 않았습니다. 나는 그것이 어디에서 왔는지 모른다. –

관련 문제