协助SQL多表查询-返回重复结果

协助SQL多表查询-返回重复结果,sql,Sql,我们使用一个在线项目管理系统,我正在尝试对它进行一些扩展 它有以下感兴趣的表格: todo_itemStatus: +--------------+-----------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----

我们使用一个在线项目管理系统,我正在尝试对它进行一些扩展

它有以下感兴趣的表格:

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>
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
但是,这会产生所有状态更新,输出如下:

<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>
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
这不是我想要的,因为我只想要一个任务条目返回todo_itemStatus表中最新条目的statusKey/statusDate

我知道我的描述有点模糊,但我不想写太长的信息。如有必要,我可以提供更多细节

有人能告诉我我做错了什么吗?我已经很久没有做任何真正的数据库工作了,所以我有点不确定我到底做错了什么

非常感谢!
Dave

您应该考虑使用独特的关键字Microsoft SQL Server

编辑:我刚刚重新阅读了你的问题,我认为GROUPBY子句更适合这种情况。但是,您应该阅读以下内容,基本上您需要做的是首先选择您对使用GROUP BY子句感兴趣的列:

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
然后,我们自连接到这组id,以获得我们感兴趣的其余列:

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);
我已经做了更多的实验,下面的查询符合我的要求:

所以我现在很高兴。谢谢你的帮助和建议


戴夫。

你好,谢谢,但我认为DISTINCT不会做我想做的事。问题是每个todo_项都有多个todo_项状态条目,我只想获取最新的。但我可能错了。。。但是快速测试产生了一个错误…是的,只要重新阅读你的问题,我认为实际上需要一组人-试图为你想出一些东西。谢谢。我会看一看那篇文章,然后重读你的帖子,让你知道我的进展如何。非常感谢。谢谢你的帮助。不幸的是,你的建议不起作用,但在你的帮助和你引用的网页的帮助下,我设法解决了这个问题。谢谢