0

[参考までに、これは宿題ではありません—質問を単純で読みやすい形式にフォーマットするように努力したので、誰もが考えていると思いますか?繰り返しますが、宿題ではありません。私は仕事をしていて、ただ学ぼうとしています。ありがとう。]

私はトリッキーなものに非常に固執しています。私は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"

2つのクエリが必要です:

(1)指定されたprojectIdについて、「現在のタスク」を取得します。現在のタスクは、sequence完了していない番号が最も小さいタスク番号です。私の例では、 getCurrentTask(projectId=100)taskId 260を返します(これは不完全な最初のものであるため)。

(2)指定されたuserIdについて、彼が「現在のタスク」に割り当てられているプロジェクトのリストを取得します。私の例では、 getProjectsForUserId(userId=57)projectId100を返します。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

最初のクエリ(更新):

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 に答える
0

それが宿題だったら、私はこれらのヒントを与えるでしょう:

(1):単純なクエリオーバーでTasks十分です。(結局のところ、プロジェクトIDを知っていますよね?)集計関数とWHERE句を使用します。

(2):構成Projectsを使用してクエリを実行してみてくださいWHERE EXISTS ...DISTINCT役に立つかもしれません。

編集:Projects 2番目のクエリにも触れる必要はありません。@trueによって投稿されたクエリは正しく見えます。

EDIT ^ 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 に答える