2013-04-10 33 views
0

我需要获取属于系统中每个项目内用户的任务数量。该表是:SQL:统计每个项目中属于某个用户的所有任务

项目: ID,名称

任务: ID,专案编号,受让人(用户)

现在我在做这个查询:

SELECT Projects.ID, Projects.Name, COUNT(*) 
FROM Tasks JOIN Projects ON Tasks.ProjectID = Projects.ID 
WHERE Assignee=1 GROUP BY Projects.ID; 

这只能部分工作。 IT将返回任务数量,但仅限于为任务分配给用户的项目。我希望查询返回系统中的所有项目,即使未分配任何任务。

我该怎么做?

谢谢!

回答

3

使用LEFT JOIN代替。

LEFT JOIN的操作与INNER JOIN不同。它所做的是返回左侧边界表的所有记录,它是Projects它是右侧表中是Tasks的匹配还是没有匹配。

SELECT Projects.ID, Projects.Name, COUNT(Tasks.ProjectID) 
FROM Projects 
     LEFT JOIN Tasks 
      ON Tasks.ProjectID = Projects.ID AND 
       Assignee=1 
GROUP BY Projects.ID; 

为了进一步获得更多的知识有关加入,请访问以下链接:

+0

问候,此查询不起作用。对于根本没有任务的项目,它会返回1。 – SrgHartman 2013-04-10 12:14:01

+2

哎呀对不起,应该是'COUNT(Tasks.ProjectID)'。请再试一次。 – 2013-04-10 12:14:47

+0

我试图通过添加另一个左连接子句来解决问题,但它不起作用: SELECT Projects.ID,Projects.Name,COUNT(Tasks.ProjectID),COUNT(Issues.ProjectID)FROM Projects 左加入任务在Tasks.ProjectID = Projects.ID和Tasks.Assignee = 1 LEFT JOIN Issues on Issues.ProjectID = Projects.ID and Issues.Assignee = 1 GROUP BY Projects.ID; 任何想法为什么?谢谢! – SrgHartman 2013-04-10 13:10:46

0

如果你需要,你需要RIGHT OUTER JOIN,而不是JOIN的所有项目:

SELECT Projects.ID, Projects.Name, COUNT(Projects.ID) 
FROM Tasks RIGHT OUTER JOIN Projects 
ON Tasks.ProjectID = Projects.ID 
AND Assignee=1 GROUP BY Projects.ID; 
+0

问候,该查询不起作用。对于根本没有任务的项目,它会返回1。 – SrgHartman 2013-04-10 12:10:28

+0

编辑,现在应该工作 – 2013-04-10 12:37:44

0

试试这个

SELECT Projects.ID, Projects.Name, COUNT(*) 
FROM Projects JOIN Tasks ON Tasks.ProjectID = Projects.ID 
WHERE Assignee=1 GROUP BY Projects.ID; 
相关问题