[仅供参考,这不是作业 - 我想每个人都认为这是因为我努力以简单易读的形式格式化我的问题?再次,不是作业。我在工作,只是想学习。感谢。]
我非常困惑于一个棘手的问题。我是一个Java人,我不是一个SQL人,所以对此有任何帮助都非常感激!
我有一个PROJECT表和一个TASK表,如下所示:
**PROJECT**
projectId
name
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"
我需要两个查询:
(1)对于给定的projectId,获取“当前任务”。当前任务是具有最小sequence
个数字的任务编号,该编号不完整。在我的示例中,getCurrentTask(projectId=100)
将返回taskId 260(因为它是第一个不完整的)。
(2)对于给定的userId,获取他被分配到“当前任务”的项目列表。在我的示例中,getProjectsForUserId(userId=57)
将返回projectId 100; getProjectsForUserId(userId=58)
不会返回任何内容。
答案 0 :(得分: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 = ?'
修改强>
下面的查询按顺序排序,而不是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 :(得分: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
答案 2 :(得分: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。
答案 3 :(得分:1)
如果是家庭作业,我会给出这些提示:
(1):对Tasks
进行简单查询即可。 (你知道项目ID,对吗?)使用聚合函数和WHERE
子句。
(2):尝试使用Projects
构造查询WHERE EXISTS ...
。 DISTINCT
也可以派上用场。
编辑:您甚至不需要触摸Projects
第二个查询。 @true发布的查询看起来是正确的。
编辑^ 2: ...但@ true的查询并未考虑只关注“当前”任务的微妙之处。