MySQL LEFT JOIN AND条件失效及添加筛选条件报错问题
解决LEFT JOIN中左表筛选条件失效的问题
我来帮你搞定这个问题!首先得搞清楚LEFT JOIN的核心特性:它会返回左表的所有记录,不管ON子句里的条件是否匹配。这就是你把EmpStatus='A'放到ON里后,依然能看到非'A'记录的原因——左表那些不符合条件的行还是会被保留,只是对应的右表字段都是NULL,看起来就像条件没起作用。
下面给你两种正确的解决方案:
方法一:把左表筛选条件放到WHERE子句中
WHERE子句是在JOIN完成后过滤整个结果集的,所以把HTG_TechProps.EmpStatus='A'放在这里,就能精准过滤掉左表中不符合条件的记录。你之前说加WHERE出现语法错误,大概率是位置放错了——一定要确保WHERE在LEFT JOIN之后、GROUP BY之前。
修改后的完整SQL:
SELECT COUNT(HTG_ScheduleRequest.ID) AS current_job, HTG_TechProps.EmpNumber, HTG_TechProps.EmpFirstName, HTG_TechProps.EmpLastName, HTG_TechProps.Veh_Number FROM HTG_TechProps LEFT JOIN HTG_ScheduleRequest ON HTG_TechProps.EmpNumber = HTG_ScheduleRequest.SSR AND (HTG_ScheduleRequest.ScheduleDateCurrent = CURDATE() || HTG_ScheduleRequest.ScheduleDateExact = CURDATE()) AND RecordType = '1' AND HTG_ScheduleRequest.JobStatus IN (2,5,8,3,4,7) WHERE HTG_TechProps.EmpStatus = 'A' -- 左表筛选条件放在这里 GROUP BY HTG_TechProps.EmpNumber ORDER BY HTG_TechProps.EmpNumber ASC;
方法二:先筛选左表再做JOIN(更清晰的写法)
如果左表的筛选条件比较复杂,或者你想让逻辑更直观,可以先通过子查询把符合条件的左表记录选出来,再和右表做LEFT JOIN:
SELECT COUNT(HTG_ScheduleRequest.ID) AS current_job, filtered_techs.EmpNumber, filtered_techs.EmpFirstName, filtered_techs.EmpLastName, filtered_techs.Veh_Number FROM ( -- 先筛选出状态为'A'的技术人员 SELECT EmpNumber, EmpFirstName, EmpLastName, Veh_Number FROM HTG_TechProps WHERE EmpStatus = 'A' ) AS filtered_techs LEFT JOIN HTG_ScheduleRequest ON filtered_techs.EmpNumber = HTG_ScheduleRequest.SSR AND (HTG_ScheduleRequest.ScheduleDateCurrent = CURDATE() || HTG_ScheduleRequest.ScheduleDateExact = CURDATE()) AND RecordType = '1' AND HTG_ScheduleRequest.JobStatus IN (2,5,8,3,4,7) GROUP BY filtered_techs.EmpNumber ORDER BY filtered_techs.EmpNumber ASC;
这两种方法都能达到你想要的效果,第一种更简洁,第二种逻辑更清晰,你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者Rocco The Taco
相关产品推荐
相关产品推荐

