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

Rob*_*ume 0 sql

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

我非常困惑于一个棘手的问题.我是一个Java人,我不是一个SQL人,所以对此有任何帮助都非常感谢!

我有一个PROJECT表和一个TASK表,如下所示:

**PROJECT**
projectId
name
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

例如:

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"
Run Code Online (Sandbox Code Playgroud)

我需要两个查询:

(1)对于给定的projectId,获取"当前任务".当前任务是具有最小sequence编号但未完成的任务编号.在我的例子中,getCurrentTask(projectId=100)将返回taskId 260(因为它是第一个不完整的).

(2)对于给定的userId,获取他被分配到"当前任务"的项目列表.在我的例子中,getProjectsForUserId(userId=57)将返回projectId 100; getProjectsForUserId(userId=58)什么都不会回报

the*_*ors 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 = ?'
Run Code Online (Sandbox Code Playgroud)

编辑

下面的查询按顺序排序,而不是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 = ?;
Run Code Online (Sandbox Code Playgroud)