0

[仅供参考,这不是家庭作业——我想每个人都认为是因为我努力将我的问题格式化为一种简单易读的形式?再次,不是家庭作业。我在工作,只是想学习。谢谢。]

我非常坚持一个棘手的问题。我是 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)不会返回任何东西。

4

4 回答 4

4
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 = ?;
于 2012-05-14T20:22:39.263 回答
0

如果是家庭作业,我会给出以下提示:

(1):一个简单的查询Tasks就可以了。(毕竟您知道项目 ID,对吗?)使用聚合函数和WHERE子句。

(2):尝试Projects使用WHERE EXISTS ...构造进行查询。DISTINCT也可能派上用场。

编辑:您甚至不需要触摸Projects第二个查询。@true 发布的查询看起来是正确的。

编辑^2: ...但是@true 的查询没有考虑到只有“当前”任务才感兴趣的微妙之处。

于 2012-05-14T20:24:51.273 回答
0
SELECT * FROM TASK
LEFT OUTER JOIN PROJECT ON 
    TASK.PROJECTID=PROJECT.PROJECTID 
WHERE TASK.STATUS='IN_PROGRESS' 
  AND PROJECT.PROJECTID=?
ORDER BY SEQUENCE ASC
于 2012-05-14T20:22:50.310 回答
0

第一个查询(更新):

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。

于 2012-05-14T20:24:38.217 回答