[英]How do I write this tricky SQL query?
[僅供參考,這不是功課,我想每個人都認為這是因為我努力以一種易於閱讀的形式來格式化我的問題嗎? 再次,不是功課。 我在工作,只是想學習。 謝謝。]
我非常棘手。 我是Java專家,不是SQL專家,因此深表感謝!
我有一個PROJECT表和一個TASK表,如下所示:
**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)
將不返回任何內容。
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 = ?'
編輯
下面的查詢按順序而不是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 = ?;
SELECT * FROM TASK
LEFT OUTER JOIN PROJECT ON
TASK.PROJECTID=PROJECT.PROJECTID
WHERE TASK.STATUS='IN_PROGRESS'
AND PROJECT.PROJECTID=?
ORDER BY SEQUENCE ASC
第一次查詢(更新):
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`
PS未向項目表添加任何聯接,因為在您的任務中,您僅詢問了ID。
如果是家庭作業,我會給出以下提示:
(1):通過Tasks
簡單查詢即可。 (您畢竟知道項目ID,對嗎?)使用聚合函數和WHERE
子句。
(2):嘗試使用WHERE EXISTS ...
構造WHERE EXISTS ...
Projects
。 DISTINCT
也可能派上用場。
編輯:您甚至不需要觸摸第二個查詢的Projects
。 @true發布的查詢看起來正確。
編輯^ 2: ...但是@true的查詢沒有考慮到只有“當前”任務才有意義的微妙之處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.