SQL Left Join但不希望左表中的所有记录

时间:2011-09-17 17:47:58

标签: mysql sql

我有2个表 - 项目和状态更新。 Project表包含id,priority和status(以及其他)的字段,我的Status更新表包含ProjectID和date等字段。

我正在尝试构建一个查询,该查询将提取所有未完成或取消的高优先级项目,并告诉我哪些项目在过去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 

2 个答案:

答案 0 :(得分: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 )

答案 1 :(得分:0)

如果您的状态表只有ProjectID作为键:

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
        )

否则,您还需要对状态表进行过滤以选择当前最新状态(这可能不是真的)。​​