2014-06-16 47 views
0

我有兩張桌子,並且想要返回所有從emp表中以及他們從時鐘表中已經工作的所有員工。如果所有活動僱員的時間都記錄在兩個日期之間,但是如果員工在沒有返回日期之間沒有記錄任何時間,則下面的查詢很有效。我需要所有活躍的員工返回,不管他們是否有時間或不在日期之間。這可以用一個MySQL查詢來完成嗎?

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

除了「加入」之前加入「左」,你會想從JOIN條件的WHERE條件移動你的病情emp.active = 1,因爲你想,要在連接嘗試是否有後應用匹配時鐘記錄。

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

完美!謝謝 :) – seaBass

相關問題