我正在尝试选择所有用户并从加入的时间表中获取每个用户记录的小时数。但是,如果用户根本没有记录任何时间,我就不会在结果中返回他们的名字。我仍然想获得每个用户的姓名,即使他们没有在时间表中记录任何内容。
如果删除该行,我可以获得所有用户的结果:
AND (times.time_date BETWEEN '2014-03-01' AND '2014-03-31')
这是我的完整查询,我做错了什么?
SELECT users.user_id,
users.user_name,
SUM(times.time_used) as hours
FROM users
LEFT JOIN times on users.user_id = times.user_id
WHERE users.user_reminder = 1
AND users.status_id = 1
AND (times.time_date BETWEEN '2014-03-01' AND '2014-03-31')
GROUP BY users.user_id
ORDER BY users.user_name
最佳答案
将 AND
子句移到 ON()
子句中,在 WHERE 子句后使用 AND 过滤器将过滤掉整个结果集,因此如果任何用户的 status_id 为 1 且 user_reminder是一个但没有时间条目将被过滤,但是如果在你的 on 子句中使用 AND 将加入特定于条件的用户并且即使他们没有时间条目也会返回 uesrs
SELECT users.user_id,
users.user_name,
SUM(times.time_used) as hours
FROM users
LEFT JOIN times on (users.user_id = times.user_id
AND (times.time_date BETWEEN '2014-03-01' AND '2014-03-31') )
WHERE users.user_reminder = 1
AND users.status_id = 1
GROUP BY users.user_id
ORDER BY users.user_name
关于MySQL 加入缺失结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22709292/