mysql - 对表中没有记录的列显示零
问题描述
我有一个 MySQL 查询,它显示两个表中的数据,这些表由字段 project_id 连接。如果 projects 表中有记录但 project_tasks 表中没有记录,则不显示任何结果。
如何显示项目表的内容,但只为 project_tasks 表中不存在的任何字段显示零?
这是查询:
SELECT
projects.project_id,
projects.project_name,
projects.project_description,
projects.creation_date,
projects.deadline,
sitelok.Name AS 'project_manager',
COUNT(project_tasks.task_id) AS 'total_tasks',
SUM(CASE
WHEN project_tasks.status = 'Completed' THEN 1
ELSE 0
END) AS 'total_completed',
SUM(CASE
WHEN project_tasks.status = 'In Progress' THEN 1
ELSE 0
END) AS 'total_in_progress',
SUM(CASE
WHEN project_tasks.status = 'Not Started' THEN 1
ELSE 0
END) AS 'total_not_started',
SUM(CASE
WHEN project_tasks.status = 'Stuck' THEN 1
ELSE 0
END) AS 'total_stuck'
FROM
projects,
project_tasks,
sitelok
WHERE
projects.project_id = project_tasks.project_id
AND projects.project_manager = sitelok.id
GROUP BY projects.project_id
解决方案
而不是从两个表中进行选择,您需要对表进行左连接project_tasks
。
您的查询将如下所示:
SELECT
projects.project_id,
IFNULL(project_tasks.task_id, 0),
...
FROM projects
LEFT OUTER JOIN project_tasks ON project_tasks.project_id = projects.id
请注意我是如何使用IFNULL()的,因此如果 project_tasks 表中没有匹配的行,它将显示 0 。
推荐阅读
- c# - JetBrains dotMemory:无法导入转储:目前不支持 32 位进程的 64 位转储
- c# - 从非标准事件创建 Observable(无 EventArgs / EventHandler)
- angular - 表格显示不正确
- swift - 使用 flatMapLatest 合并两个流
- ffmpeg - 当比特率太大时,nvencinitializeencoder 失败
- csv - 导入neo4j的csv文件,每行有多个字段,如何分别导入这些字段?
- c# - StringBuilder 在隐藏消息中显示空格
- node.js - 在 express api 中处理查询字符串的最佳方法是什么?
- php - 如何使用 str_replace 或其他函数只更改一次单词内的字符串?
- php - 如何在 laravel 的下拉列表中使用级联填充数据?