2012-05-14 34 views
0

[僅供參考,這不是作業—我想大家都認爲,因爲我努力以簡單的可讀形式來設置我的問題的格式?再次,不是作業。我在工作,只是想學習。謝謝。]如何編寫這個棘手的SQL查詢?

我很困難的一個。我是一個Java人,我不是一個SQL人,所以任何幫助,這是非常感謝!

我有一個項目表和任務表所示:

**PROJECT** 
projectId 
name 

項目有很多任務:

**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" 

我需要兩個查詢:

(1)對於給projectId,得到'當前任務'。當前任務是具有最小sequence號碼的任務號碼,該號碼不完整。在我的例子中,getCurrentTask(projectId=100)將返回taskId 260(因爲它是第一個不完整的)。

(2)對於給定的userId,獲取他被分配給「當前任務」的項目列表。在我的例子中,getProjectsForUserId(userId=57)會返回projectId 100; getProjectsForUserId(userId=58)不會返回任何內容。

+0

沒有什麼棘手的,只是瞭解內部連接和聚合函數。 –

+1

你的例子似乎不正確的我:我不明白爲什麼getProjectsForUserId(58)應該什麼都不返回。謹慎闡述? – DocJones

+1

@DocJones - getProjectsForUserId(58)不會返回任何內容,因爲userId 58未分配給「當前任務」。任務「安裝窗口」是當前的任務。系統工作的方式是,用戶58在「安裝窗口」之後可以開始他的「建造屋頂」摟板。謝謝。 –

回答

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

你也需要一個ORDER BY(假設他正在尋找下一個要完成的任務) – DocJones

1

如果是家庭作業,我願意給這些提示:

(1):在Tasks一個簡單的查詢就可以了。 (畢竟你知道項目ID,對嗎?)使用聚合函數和WHERE子句。

(2):嘗試查詢Projects使用WHERE EXISTS ...構造。 DISTINCT也可能派上用場。

編輯:你甚至不需要觸摸Projects第二個查詢。 @true發佈的查詢看起來是正確的。

編輯^ 2: ...但@真的查詢不考慮只有「當前」任務感興趣的微妙。

+0

感謝您的幫助,但它不是功課。我是一名具有非常基本的SQL知識的專業Java程序員。我希望有一天你會陷入一個複雜的Java問題,所以我可以用'提示'來貶低你的問題。 ;) –

+1

那麼爲什麼'homework'標籤呢? – krlmlr

+0

我沒有添加作業標籤。我不知道它來自哪裏。 –