2011-09-17 61 views
0

我有2個表 - 項目和狀態更新。項目表具有ID,優先級和狀態(等等)的字段,我的狀態更新表具有ProjectID和日期等字段。SQL左連接,但不希望所有記錄在左表

我想建立一個查詢,將拉取所有未完成或取消的高優先級項目,並告訴我哪些在過去14天內沒有與它們關聯的狀態更新。

我有以下信息,但它從左表中給我所有項目,而不是過濾狀態不是完成或取消的高優先級項目。

任何幫助將非常滿意。

Select proj.id, proj.Priority, proj.status, proj.ProjectName, status_tmp.statusdate,  status_tmp.statusdetail 

FROM proj 

LEFT JOIN (SELECT s1.* 
FROM projectstatus AS s1 
LEFT JOIN projectstatus AS s2 
ON s1.statusproj = s2.statusproj AND s1.statusdate < s2.statusdate 

WHERE s2.statusproj IS NULL) as status_tmp 

ON (proj.id=status_tmp.statusproj) 

where proj.Priority='High' AND proj.status!='Cancelled' and 
proj.status!='Completed' AND 
status_tmp.statusdate < DATE_SUB(CURDATE(),INTERVAL 14 DAY) OR 
status_tmp.statusdate IS null 

回答

1

嘗試把一個括號中的where子句中的最後一部分是這樣:

Select proj.id, proj.Priority, proj.status, proj.ProjectName, status_tmp.statusdate,  status_tmp.statusdetail 

FROM proj 

LEFT JOIN (SELECT s1.* 
FROM projectstatus AS s1 
LEFT JOIN projectstatus AS s2 
ON s1.statusproj = s2.statusproj AND s1.statusdate < s2.statusdate 

WHERE s2.statusproj IS NULL) as status_tmp 

ON (proj.id=status_tmp.statusproj) 

where proj.Priority='High' AND proj.status!='Cancelled' and 
proj.status!='Completed' AND 

(status_tmp.statusdate < DATE_SUB(CURDATE(),INTERVAL 14 DAY) OR 
status_tmp.statusdate IS null) 
+0

非常感謝...非常接近,但迄今爲止。 – Phill

0

如果你的狀態表只有在專案編號爲關鍵:

SELECT P.* 
FROM 
    proj P 
     LEFT JOIN projectstatus S ON P.id = S.ProjectID 
WHERE 
    P.Priority = 'High' 
    AND P.status NOT IN ('Cancelled', 'Completed') 
    AND 
     (
     S.statusdate < DATE_SUB(CURDATE(), INTERVAL 14 DAY) 
     OR 
     S.statusdate IS NULL 
     ) 

否則你」我們還需要在狀態表上過濾以選擇當前狀態(這可能不是真的)。

相關問題