Подтвердить что ты не робот

ИЛИ конфликт между другими условиями

У меня есть следующий запрос:

    SELECT * FROM `Contacts` 
WHERE `Zona` = '1' 
AND `Responsable` = '9' 
AND `AllowComercialVisit` = 'Call_Again'
-- the problem are OR --
OR `AllowComercialVisit` = 'Busy' 
OR `AllowComercialVisit` = 'Not_answered' 
-- the problem are OR --
AND `DateRecall` <= '2016-06-20 13:04:52' 
AND `DateRecall` >= '2016-06-20 12:39:52' 
ORDER BY `DateRecall` ASC LIMIT 1

Проблема заключается в том, что запрос должен ТОЛЬКО отображать строки между первым и вторым "DateRecall", но возвращать все строки с помощью "Call_Again", "Busy" и "Not_answered" без фильтрации дата.

Любое решение будет оценено!

4b9b3361

Ответ 1

Простой IN() решил бы это:

SELECT * FROM `Contacts` 
WHERE `Zona` = '1' 
    AND `Responsable` = '9' 
    AND `AllowComercialVisit` IN ('Call_Again','Busy','Not_answered') 
    AND `DateRecall` BETWEEN '2016-06-20 12:39:52'
                         AND '2016-06-20 13:04:52' 
ORDER BY `DateRecall` ASC
LIMIT 1

В общем случае AND имеет приоритет над OR, при использовании OR попробуйте использовать круглые скобки →

WHERE COND1 AND COND2 AND (COND3 OR COND4) AND COND5

Это заставит оптимизатор следовать вашему приоритету, а не по умолчанию.

Ответ 2

Попробуйте выполнить следующий запрос:

SELECT * FROM `Contacts` 
WHERE `Zona` = '1' 
AND `Responsable` = '9' 
AND (`AllowComercialVisit` = 'Call_Again' OR `AllowComercialVisit` = 'Busy' OR AllowComercialVisit` = 'Not_answered')
AND `DateRecall` <= '2016-06-20 13:04:52' 
AND `DateRecall` >= '2016-06-20 12:39:52' 
ORDER BY `DateRecall` ASC 
LIMIT 1

Просто окружите OR скобками.

Ответ 3

Попробуйте сгруппировать операторы OR, поскольку они относятся к одному столбцу, то есть.

SELECT * FROM `Contacts` 
WHERE `Zona` = '1' 
AND `Responsable` = '9' 
AND (`AllowComercialVisit` = 'Call_Again' 
OR `AllowComercialVisit` = 'Busy' 
OR `AllowComercialVisit` = 'Not_answered' ) 
AND `DateRecall` <= '2016-06-20 13:04:52' 
AND `DateRecall` >= '2016-06-20 12:39:52' 
ORDER BY `DateRecall` ASC LIMIT 1

Ответ 4

Вы можете использовать оператор IN() вместо OR:

SELECT * FROM `Contacts` 
WHERE `Zona` = '1' 
    AND `Responsable` = '9' 
    AND `AllowComercialVisit` IN('Call_Again','Busy','Not_answered')
    AND `DateRecall` <= '2016-06-20 13:04:52' 
    AND `DateRecall` >= '2016-06-20 12:39:52' 
    ORDER BY `DateRecall` ASC LIMIT 1