简体   繁体   English

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

[英]How do I write this tricky SQL query?

[FYI, this is not homework — I guess everyone thinks that because I made an effort to format my question in a simple readable form? [仅供参考,这不是功课,我想每个人都认为这是因为我努力以一种易于阅读的形式来格式化我的问题吗? Again, not homework. 再次,不是功课。 I'm at work, and just trying to learn. 我在工作,只是想学习。 Thanks.] 谢谢。]

I'm very stuck on a tricky one. 我非常棘手。 I'm a Java guy, I'm not a SQL guy, so any help with this is GREATLY appreciated! 我是Java专家,不是SQL专家,因此深表感谢!

I have a PROJECT table and a TASK table like so: 我有一个PROJECT表和一个TASK表,如下所示:

**PROJECT**
projectId
name

PROJECT has many TASKs: 项目有许多任务:

**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

For example: 例如:

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"

I need two queries: 我需要两个查询:

(1) For a given projectId, get the 'current task'. (1)对于给定的projectId,获取“当前任务”。 The current task is the task number with the smallest sequence number which is not complete. 当前任务是sequence号最小且未完成的任务号。 In my example, getCurrentTask(projectId=100) would return taskId 260 (because it's the first one that is incomplete). 在我的示例中, getCurrentTask(projectId=100)将返回taskId 260(因为它是第一个不完整的)。

(2) For a given userId, get the list of projects where he is assigned to a 'current task'. (2)对于给定的userId,获取将其分配给“当前任务”的项目列表。 In my example, getProjectsForUserId(userId=57) would return projectId 100; 在我的示例中, getProjectsForUserId(userId=57)将返回projectId 100; getProjectsForUserId(userId=58) would return nothing. 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 = ?'

EDIT 编辑

The queries below order by sequence, instead of TaskID. 下面的查询按顺序而不是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

First Query (updated): 第一次查询(更新):

SELECT taskId FROM `task` 
WHERE `projectId`=100 AND `status` = "IN_PROGRESS" 
ORDER BY `sequence`
LIMIT 1

Second one: 第二个:

SELECT DISTINCT(projectId) FROM task 
WHERE userId=57 AND `status` = "IN_PROGRESS"
ORDER BY `sequence`

PS Didn't added any joins to project table, because in your task you asked only about ids. PS未向项目表添加任何联接,因为在您的任务中,您仅询问了ID。

If it were homework, I'd give these hints: 如果是家庭作业,我会给出以下提示:

(1): A simple query over Tasks will do. (1):通过Tasks简单查询即可。 (You know the project ID after all, right?) Use aggregate functions and a WHERE clause. (您毕竟知道项目ID,对吗?)使用聚合函数和WHERE子句。

(2): Try quering Projects using a WHERE EXISTS ... construct. (2):尝试使用WHERE EXISTS ...构造WHERE EXISTS ... Projects DISTINCT might come in handy, too. DISTINCT也可能派上用场。

EDIT: You don't even need to touch Projects for the second query, too. 编辑:您甚至不需要触摸第二个查询的Projects The queries posted by @true look correct. @true发布的查询看起来正确。

EDIT^2: ...but @true's query don't consider the subtlety that only the "current" tasks are of interest. 编辑^ 2: ...但是@true的查询没有考虑到只有“当前”任务才有意义的微妙之处。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM