这可以通过一个MySQL查询来完成吗?

时间:2014-06-16 15:38:42

标签: mysql join

我有两个表,希望从 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

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

SQLfiddle demo

结果:

|   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 |