ИЛИ конфликт между другими условиями
У меня есть следующий запрос:
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" без фильтрации дата.
Любое решение будет оценено!
Ответы
Ответ 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