[英]SQL Left Join but don't want all records in the left table
我有2个表格-项目和状态更新。 项目表具有ID,优先级和状态(除其他外)字段,我的状态更新表具有ProjectID和日期等字段。
我正在尝试建立一个查询,以提取所有尚未完成或未取消的高优先级项目,并告诉我在过去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
尝试这样在您的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 )
如果状态表仅将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
)
否则,您还需要在状态表上进行过滤以选择当前的最新状态(可能不正确)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.