MySQL LEFT JOIN忽略AND条件

时间:2019-04-09 15:09:43

标签: mysql sql

我有一个功能如下的LEFT JOIN MySQL查询:

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)   
        GROUP BY HTG_TechProps.EmpNumber ORDER BY HTG_TechProps.EmpNumber ASC

我需要像这样在初始SELECT表中添加一些条件:

HTG_TechProps.EmpStatus='A'

当我在LEFT JOIN之前添加WHERE语句,并且在LEFT JOIN之后添加这样的AND时,会出现语法错误。它将被忽略,仍然返回不等于A的记录。

LEFT JOIN HTG_ScheduleRequest ON HTG_TechProps.EmpNumber = HTG_ScheduleRequest.SSR      
AND HTG_TechProps.EmpStatus='A'

2 个答案:

答案 0 :(得分:2)

LEFT JOIN中第一个表的条件应该放在WHERE子句中:

SELECT COUNT(sr.ID) AS current_job,
       tp.EmpNumber, tp.EmpFirstName, tp.EmpLastName, tp.Veh_Number
FROM HTG_TechProps tp LEFT JOIN
     HTG_ScheduleRequest sr
     ON tp.EmpNumber = sr.SSR AND
        (sr.ScheduleDateCurrent = CURDATE() OR sr.ScheduleDateExact = CURDATE()
        ) AND
        sr.RecordType = '1' AND  -- assume this comes from SR
        sr.JobStatus IN (2, 5, 8, 3, 4, 7)   
WHERE tp.EmpStatus='A'
GROUP BY tp.EmpNumber  -- this is okay assuming that it is unique or (equivalently) a primary key
ORDER BY tp.EmpNumber ASC;

请注意,这引入了表别名,因此查询更易于编写和阅读。

答案 1 :(得分:0)

您应该使用OR

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() OR  HTG_ScheduleRequest.ScheduleDateExact = CURDATE())
        AND RecordType = '1' 
        AND HTG_ScheduleRequest.JobStatus IN (2,5,8,3,4,7)   
GROUP BY HTG_TechProps.EmpNumber 
ORDER BY HTG_TechProps.EmpNumber ASC

,如果您想在主表列的位置应用条件,则可以在以下位置使用:

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.JobStatus IN (2,5,8,3,4,7)   
WHERE (HTG_ScheduleRequest.ScheduleDateCurrent = CURDATE() OR  HTG_ScheduleRequest.ScheduleDateExact = CURDATE())
AND HTG_TechProps.RecordType = '1' 
GROUP BY HTG_TechProps.EmpNumber 
ORDER BY HTG_TechProps.EmpNumber ASC