我有两个表,任务和状态。任务表具有列task_id,project_id task_content和status_id。状态表具有列status_id和status_name。 我想查询所有状态名称并计算有多少具有该状态名称的任务。我的查询如下:
编辑:我忘记添加project_id。查询只需要检查一个项目中的任务。
SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s
LEFT JOIN tasks t
ON s.status_id = t.status_id
WHERE t.project_id = 1
GROUP BY s.status_name
我的查询工作正常,但是当没有状态之一的任务时,此状态从查询中删除,我希望它显示为零,例如:
status name | tasks
status 1 | 3
status 2 | 2
status 3 | 0
但我的查询如下:
status name | tasks
status 1 | 3
status 2 | 2
答案 0 :(得分:0)
这是基于原始帖子的答案(在进行任何编辑之前):
在t.status_id
内使用column_name(即count()
):
SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s LEFT JOIN
tasks t
ON s.status_id = t.status_id
GROUP BY s.status_name;
答案 1 :(得分:0)
尝试以下方法-使用count(t.status_id)
代替count(*)
SELECT s.status_id,s.status_name, COUNT(t.status_id) AS tasks
FROM status s
LEFT JOIN tasks t
ON s.status_id = t.status_id
GROUP BY s.status_id,s.status_name
答案 2 :(得分:0)
尝试如下
SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s
LEFT JOIN tasks t
ON s.status_id = t.status_id
GROUP BY s.status_name
请注意,您还需要在左侧表格中status 3
使用此值,否则它将以其他名称出现
答案 3 :(得分:0)
感谢大家的帮助,我找到了解决方案。我将其发布给以后遇到相同或相似问题的每个人。使用“ WHERE”弄乱了我的左联接,所以有解决方法:
SELECT s.status_name, (IFNULL(COUNT(t.task_id), 0)) AS tasks
FROM status s
LEFT OUTER JOIN tasks t
ON s.status_id = t.status_id
AND t.project_id = 1
GROUP BY s.status_name
答案 4 :(得分:0)
只需将where
条件移动到on
子句:
SELECT s.status_name, COUNT(t.status_id) AS tasks
FROM status s LEFT JOIN
tasks t
ON s.status_id = t.status_id AND
t.project_id = 1
GROUP BY s.status_name;
COUNT()
从不返回NULL
值,因此您不需要任何额外的检查。如果没有匹配项,它将返回0
。