Mysql 或其他条件之间的冲突
我有以下疑问:Mysql 或其他条件之间的冲突,mysql,sql,date,select,Mysql,Sql,Date,Select,我有以下疑问: SELECT * FROM `Contacts` WHERE `Zona` = '1' AND `Responsable` = '9' AND `AllowComercialVisit` = 'Call_Again' -- the problem are OR's -- OR `AllowComercialVisit` = 'Busy' OR `AllowComercialVisit` = 'Not_answered' -- the problem are OR
SELECT * FROM `Contacts`
WHERE `Zona` = '1'
AND `Responsable` = '9'
AND `AllowComercialVisit` = 'Call_Again'
-- the problem are OR's --
OR `AllowComercialVisit` = 'Busy'
OR `AllowComercialVisit` = 'Not_answered'
-- the problem are OR's --
AND `DateRecall` <= '2016-06-20 13:04:52'
AND `DateRecall` >= '2016-06-20 12:39:52'
ORDER BY `DateRecall` ASC LIMIT 1
问题是,查询应该只显示第一个和第二个“DateRecall”之间的行,但返回所有带有“Call\u Reach”、“Busy”和“Not\u Responsed”的行,而不过滤日期
任何解决方案都将不胜感激 一个简单的方法可以解决这个问题:
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
一般来说,和优先于或,当使用或尝试使用括号->
WHERE COND1 AND COND2 AND (COND3 OR COND4) AND COND5
这将强制优化器遵循您的优先级,而不是默认优先级。尝试以下查询:
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括起来 尝试对与同一列相关的OR语句进行分组, i、 e 您可以使用IN语句代替ORs:
在任何语言中,永远不要混合使用或使用或不使用括号来明确分组。即使在某些情况下这不是严格要求的,没有他们,没有人能够理解你的意图。虽然我不同意没有他们,没有人能够理解你的意图,但我绝对同意总是使用括号。我唯一的例外是,当您在支持它的语言(如Python)中进行一次比较时;在所有其他情况下,括号不仅使代码更具可读性,还可以保护您免受操作顺序问题和其他难以量化的问题的影响,例如PHP中的某些布尔怪癖,这些怪癖没有逻辑意义,但仍然可以通过这种方式避免。对于SQL查询,还考虑嵌套清晰度的缩进级别。您还不能在两者之间使用以进一步缩短查询吗?我意识到这对优化器没有影响,但我发现它更容易阅读。
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
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