2011-09-17 3 views
0

私は2つのテーブルを持っています - プロジェクトとステータスの更新。 Projectテーブルには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句の最後の部分に括弧を入れてみてください:あなたのステータステーブルにはキーとしてのみPROJECTIDを持っている場合

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 
     ) 

そうでない場合は、あなたが」現在のステータスを選択するには、ステータステーブルのフィルタリングも必要です(これは当てはまらないかもしれません)。

関連する問題