我有两个表,想要返回 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
最佳答案
无论右表值是否匹配,都返回左表值正是LEFT JOIN
是为了。
除了在“JOIN”之前添加“LEFT”之外,您还需要将 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 |
关于mysql - 这可以通过一个 MySQL 查询来完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24247378/