2014-02-17 53 views
2

我目前正在開發一個簡單的員工調度工具,並且遇到SQL查詢問題。爲了解釋我的問題,請使用這兩個非常抽象的表格。從左邊加入的特定日期中選擇行

第一個表只是由員工

 
employees 
====================== 
empId | name | ... 
---------------------- 
10 | Scott | 
11 | Schrute | 
12 | Halpert | 
13 | Howard | 

在第二個表你會發現分配的任務通過一天的每個員工。

 
tasks 
============================================== 
tasId | name | task  | date  | ... 
---------------------------------------------- 
10 | Scott | Support | 2014-02-17 | 
11 | Scott | Bugfix | 2014-02-18 | 
12 | Halpert | Bugfix | 2014-02-17 | 
13 | Halpert | Develop | 2014-02-18 | 
14 | Howard | Support | 2014-02-17 | 

現在我想知道什麼是員工上月17工作或自己有沒有計劃在這一天的任務。我使用下面的SQL查詢來做到這一點。

SELECT e.name, t.task 
FROM employees e LEFT JOIN tasks t ON e.name = t.name 
WHERE date IS NULL OR date = DATE('2014-02-17') 

結果提供正是我需要的:

 
name | task 
-------------------- 
Scott | Support 
Schrute | NULL 
Halpert | Bugfix 
Howard | Support 

而現在我的問題。如果我要見2月18日我得到這個結果集的任務:

 
name | task 
-------------------- 
Scott | Bugfix 
Schrute | NULL 
Halpert | Develop 

的理由,這是顯而易見的,霍華德的任務的日期既不是NULL也不等於2014年2月18日。什麼將是獲得理想效果的最佳方式?

我使用MySQL和PHP。

(很抱歉的愚蠢的冠軍,我也想不出什麼更好的主意。)

回答

1

移動你的過濾器連接謂詞:

SELECT e.name, t.task 
FROM employees e 
LEFT JOIN tasks t ON e.name = t.name AND t.date = DATE('2014-02-18'); 

您的查詢,因爲它只會返回誰沒有任務可言,或者在指定日期的任務的人。它會省略有任務的人員,但不會在指定的日期。考慮沒有加入您的樣本數據的結果where子句:

empId | name | task  | date  | ... 
----------------------------------------| 
10 | Scott | Support | 2014-02-17 | 
10 | Scott | Bugfix | 2014-02-18 | 
11 | Schrute | NULL  | NULL  | 
12 | Halpert | Bugfix | 2014-02-17 | 
12 | Halpert | Develop | 2014-02-18 | 
13 | Howard | Support | 2014-02-17 | 

正如你可以看到有霍華德沒有記錄其中Date = 2014年2月18日,或在Date爲null,這就是爲什麼沒有記錄返回霍華德。當您將過濾器添加到連接謂詞時,結果變爲:

empId | name | task  | date  | ... 
----------------------------------------| 
10 | Scott | Bugfix | 2014-02-18 | 
11 | Schrute | NULL  | NULL  | 
12 | Halpert | Develop | 2014-02-18 | 
13 | Howard | NULL  | NULL  | 

我認爲這是所需的結果。

+0

完美的,正是我所需要的。非常感謝! – cheeZer

0

您可以使用

UNIX_TIMESTAMP(`date`) = 0 

看起來你有被存儲爲「0000-00一些數據-00'並且它不爲空,因此如上所述添加額外的OR條件也會返回這些數據。