MySQL LEFT JOIN忽略AND条件

问题描述 投票:0回答:2

我有一个功能性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'
mysql sql
2个回答
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;

请注意,这会引入表别名,因此查询更容易编写和读取。


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
© www.soinside.com 2019 - 2024. All rights reserved.