我有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
答案 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
)
否则,您还需要对状态表进行过滤以选择当前最新状态(这可能不是真的)。