簡體   English   中英

如何編寫這個棘手的SQL查詢?

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

[僅供參考,這不是功課,我想每個人都認為這是因為我努力以一種易於閱讀的形式來格式化我的問題嗎? 再次,不是功課。 我在工作,只是想學習。 謝謝。]

我非常棘手。 我是Java專家,不是SQL專家,因此深表感謝!

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

**PROJECT**
projectId
name

項目有許多任務:

**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)將不返回任何內容。

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 = ?;
SELECT * FROM TASK
LEFT OUTER JOIN PROJECT ON 
    TASK.PROJECTID=PROJECT.PROJECTID 
WHERE TASK.STATUS='IN_PROGRESS' 
  AND PROJECT.PROJECTID=?
ORDER BY SEQUENCE ASC

第一次查詢(更新):

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。

如果是家庭作業,我會給出以下提示:

(1):通過Tasks簡單查詢即可。 (您畢竟知道項目ID,對嗎?)使用聚合函數和WHERE子句。

(2):嘗試使用WHERE EXISTS ...構造WHERE EXISTS ... Projects DISTINCT也可能派上用場。

編輯:您甚至不需要觸摸第二個查詢的Projects @true發布的查詢看起來正確。

編輯^ 2: ...但是@true的查詢沒有考慮到只有“當前”任務才有意義的微妙之處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM