2009-07-29 70 views
0

我們使用在線項目管理系統,並試圖稍微擴展它。幫助SQL多表查詢 - 返回重複結果

它的利益如下表:

 
todo_itemStatus: 
+--------------+-----------------------+------+-----+---------------------+----------------+ 
| Field  | Type     | Null | Key | Default    | Extra   | 
+--------------+-----------------------+------+-----+---------------------+----------------+ 
| itemStatusId | bigint(20) unsigned | NO | PRI | NULL    | auto_increment | 
| itemId  | int(10) unsigned  | NO | MUL | 0     |    | 
| statusDate | datetime    | NO |  | 0000-00-00 00:00:00 |    | 
| statusKey | tinyint(3) unsigned | NO |  | 0     |    | 
| memberId  | mediumint(8) unsigned | NO |  | 0     |    | 
+--------------+-----------------------+------+-----+---------------------+----------------+ 

此表跟蹤當任務完成,同時還保存了所有任務的狀態發生變化。

然後有一個項目表和一個'項目'(或任務)表。

我基本上想要能夠提取項目列表,並提供有關完成任務的百分比的詳細信息。但是,現在我很高興能夠列出項目中的每項任務,並詳細說明它們是否完整。

據我所知,獲取任務最近狀態的最好方法是選擇一個todo_itemStatus,其中statusDate是最新的,或者itemStatusId是最大的,而itemId等於我的任務感興趣。

我想這樣的查詢:

<pre> 
select todo_item.itemId, todo_item.title, todo_itemStatus.statusKey, todo_itemStatus.statusDate 
from todo_item, todo_project, todo_itemStatus 
where todo_item.projectId = todo_project.projectId 
and todo_project.projectId = 13 
and todo_itemStatus.itemId = todo_item.itemId 
and todo_itemStatus.statusDate = (
    select MAX(todo_itemStatus.statusDate) 
    from todo_itemStatus key1 where todo_itemStatus.itemId = key1.itemId); 
</pre> 

然而,這會產生的所有狀態更新與輸出這樣的:

 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 
| itemId | title                  | statusKey | statusDate   | 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 
| 579 | test complete item - delete me            |   1 | 2009-07-28 13:04:38 | 
| 579 | test complete item - delete me            |   0 | 2009-07-28 14:12:12 | 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 

這不是我想要什麼,我只想要一個任務條目以todo_itemStatus表中最新條目的statusKey/statusDate返回。

我知道我在描述中有點模糊,但我不想寫出大量的長信息。如有必要,我可以提供更多細節。

請有人建議我做錯了什麼?我已經做了很長一段時間,因爲我已經做了任何真正的數據庫的東西,所以我有點不確定我在這裏做錯了什麼...

非常感謝! 戴夫

回答

0

我已經嘗試多一些和下面的查詢我想要做什麼:

 
select todo_item.itemId, todo_item.title, todo_itemStatus.statusKey, todo_itemStatus.statusDate from todo_itemStatus, todo_item where todo_item.itemId = todo_itemStatus.itemId and todo_item.projectId = 13 and todo_itemStatus.statusDate = (select MAX(status.statusDate) from todo_itemStatus as status where status.itemId = todo_item.itemId); 

所以我現在很高興。感謝所有的幫助和建議。

戴夫。

1

你應該考慮使用DISTINCT關鍵字(Microsoft SQL Server的)

編輯:我剛剛重新閱讀你的問題,我認爲,在GROUP BY子句更適合在這種情況下。你應該閱讀http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/,但基本上你需要做的就是首先選擇您有興趣使用GROUP BY子句中的列是什麼:

SELECT todo_itemStatus.itemStatusId, MAX(todo_itemStatus.statusDate) 
FROM todo_item, todo_project, todo_itemStatus 
WHERE todo_item.projectId = todo_project.projectId 
AND todo_itemStatus.itemId = todo_item.itemId 
AND todo_project.projectId = 13 
GROUP BY itemStatusId 

然後我們自聯接這套ID的來獲得的休息我們列感興趣:

SELECT 
    todo_item.itemId, 
    todo_item.title, 
    todo_itemStatus.statusKey, 
    todo_itemStatus.statusDate 
FROM todo_item 
JOIN todo_itemStatus 
ON todo_itemStatus.itemId = todo_item.itemId 
JOIN 
    (SELECT todo_itemStatus.itemStatusId, MAX(todo_itemStatus.statusDate) 
    FROM todo_item, todo_project, todo_itemStatus 
    WHERE todo_item.projectId = todo_project.projectId 
    AND todo_itemStatus.itemId = todo_item.itemId 
    AND todo_project.projectId = 13 
    GROUP BY itemStatusId) AS x 
ON todo_itemStatus.itemStatusId = x.itemStatusId 
+0

嗨,謝謝,但我不認爲DISTINCT會做我想做的事。問題在於它們每個todo_item有多個todo_itemStatus條目,我只想獲得最新的。我可能是錯的,但...但一個快速測試只是產生了一個錯誤... – DaveS 2009-07-29 09:01:56