我有一个表格说明,用户可以在其中记录他们在项目上花费的时间。声明具有开始和结束时间。
我想要一个特定的项目(id = 1),每个用户在项目上花费的总秒数,即使用户根本没有在项目上花费任何时间。
表格(简体):
users
-----
- id
- name
- ...
projects
--------
- id
- name
declarations
------------
- id
- user_id
- project_id
- begin
- end
假设有 2 个用户。用户 ID=1 在项目上花费了一些时间,而用户 ID=2 没有执行任何操作。
select users.*, sum(timestampdiff(second, declarations.start, declarations.end)) as seconds
from users
join declarations on declarations.user_id = users.id
where declarations.project_id = 1
group by users.id
使用上述查询,将仅显示用户 1。如何以这种方式修改查询以包括所有其他用户,值为 seconds
0
?
考虑使用LEFT OUTER JOIN
并将该WHERE
条件移动到JOIN ON
条件,例如
select users.*,
sum(timestampdiff(second, declarations.start, declarations.end)) as seconds
from users
left join declarations on declarations.user_id = users.id
and declarations.project_id = 1
group by users.id