2009-07-29 69 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