2011-09-17 1 views
0

J'ai 2 tables - Projets et mises à jour de statut. La table de projet a des champs pour l'identification, la priorité, et l'état (parmi d'autres) et ma table de mise à jour d'état a des champs pour ProjectID, et la date parmi d'autres. J'essaye de construire une requête qui tirera tous les projets de haute priorité qui ne sont pas terminés ou annulés et dites-moi lesquels de ceux qui n'ont pas une mise à jour de statut qui leur sont associés au cours des 14 derniers jours.SQL Left Joindre mais ne veut pas tous les enregistrements dans le tableau de gauche

J'ai ce qui suit, mais il me donne tous les projets de la table de gauche et ne filtre pas sur les projets de haute priorité dont le statut n'est pas terminé ou annulé.

TOUTE AIDE SERA TRÈS APPRÉCIÉE.

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 

Répondre

1

Essayez de mettre une parenthèse dans la dernière partie de votre clause where si:

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

Merci beaucoup ... si près et pourtant si loin. – Phill

0

Si votre table d'état n'a que la ProjectID comme la clé:

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 
     ) 

Sinon, vous » Il faudra aussi filtrer sur la table d'état pour sélectionner l'état le plus courant (cela peut ne pas être vrai).

Questions connexes