我该如何编写这个棘手的SQL查询?

时间:2012-05-14 20:17:02

标签: sql

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

我非常困惑于一个棘手的问题。我是一个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 个答案:

答案 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的查询并未考虑只关注“当前”任务的微妙之处。