Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 或其他条件之间的冲突_Mysql_Sql_Date_Select - Fatal编程技术网

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