我有两个表,希望从 emp 表中返回所有处于活动状态的员工,以及他们从 timeclock 表中工作的任何时间。如果所有活跃员工在两个日期之间记录时间但是如果员工在没有返回日期之间没有任何时间记录,则下面的查询效果很好。无论日期之间是否有时间,我都需要所有活跃的员工。
emp table
user active
jblow 1
jdoe 1
dcook 0
ajones 1
timeclock table
user date hours
jblow 2014-06-01 8.3
dcook 2013-12-23 7.5
jdoe 2014-06-03 8.1
jblow 2014-06-02 7.9
jblow 2014-05-23 8.0
SELECT emp.user, emp.active, timeclock.date, timeclock.hours FROM emp JOIN timeclock ON emp.user = timeclock.user AND emp.active = 1 AND timeclock.date BETWEEN "20140601" AND "20140603" ORDER BY emp.user ASC
上面的查询不返回ajones,因为他没有在日期之间记录任何时间,但我需要它来返回所有活跃的员工。我寻找的结果将是这样的:
ajones 1 null null
jblow 1 2014-06-01 8.3
jblow 1 2014-06-02 7.9
jdoe 1 2014-06-03 8.1
答案 0 :(得分:1)
无论匹配的右表值如何,返回左表值正是LEFT JOIN
的用途。
除了添加" LEFT"在" JOIN"之前,您想要将emp.active = 1
条件从JOIN条件移动到WHERE条件,因为您希望在连接尝试后应用该条件是否存在匹配 timeclock 记录。
SELECT emp.user, emp.active, timeclock.date, timeclock.hours
FROM emp
LEFT JOIN timeclock
ON emp.user = timeclock.user
AND timeclock.date BETWEEN "20140601" AND "20140603"
WHERE emp.active = 1
ORDER BY emp.user ASC
结果:
| USER | ACTIVE | DATE | HOURS |
|--------|--------|-----------------------------|--------|
| ajones | 1 | (null) | (null) |
| jblow | 1 | June, 02 2014 00:00:00+0000 | 7.9 |
| jblow | 1 | June, 01 2014 00:00:00+0000 | 8.3 |
| jdoe | 1 | June, 03 2014 00:00:00+0000 | 8.1 |