MySQL LEFT JOIN игнорирует критерии И - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть функциональный запрос 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'

Я получаю синтаксическую ошибку, когда добавляю оператор WHERE перед LEFT JOIN, и когда я добавляю AND, как это, после LEFT JOIN игнорируется все еще возвращающиеся записи, которые не равны A.

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

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Условия для первой таблицы в 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 голосов
/ 09 апреля 2019

Вы должны использовать ИЛИ

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...