查询返回所有行

问题描述:

为什么此查询返回与我的OR LIKE条件匹配的所有行并跳过doctorLangcity。我的意思是我得到所有城镇中的所有行,而不是仅在某个行中。查询返回所有行

SELECT `doctor`.`id`, `doctorLang`.`first_name`, `doctorLang`.`second_name`, `doctorLang`.`city`, `doctorLang`.`hospital_name` 
FROM `doctor` LEFT JOIN `doctorLang` ON `doctor`.`id`=`doctorLang`.`doc_id` 
WHERE `doctorLang`.`city`='Пловдив' 
AND `doctorLang`.`language`='bg' 
AND `doctor`.`active`=1 
AND `doctorLang`.`first_name` LIKE '%йло' 
OR `doctorLang`.`first_name` LIKE '%йло%' 
OR `doctorLang`.`first_name` LIKE 'йло%' 
OR `doctorLang`.`second_name` LIKE '%йло' 
OR `doctorLang`.`second_name` LIKE '%йло%' 
OR `doctorLang`.`second_name` LIKE 'йло%' 
OR `doctorLang`.`third_name` LIKE '%йло' 
OR `doctorLang`.`third_name` LIKE '%йло%' 
+0

提供您的样品输入 - 输出... –

+2

因为你没有使用禁忌。古典错误。 – fancyPants

+1

['AND'运算符](https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html)的优先级高于['OR'运算符](https:// dev .mysql.com/DOC/refman/5.7/EN /运营商precedence.html)。为此指责数学。 – axiac

这是你WHERE条款的一个版本,它应该像预期的那样:

WHERE 
    doctorLang.city = 'Пловдив' AND 
    doctorLang.language = 'bg' AND 
    doctor.active = 1   AND 
    (
     doctorLang.first_name LIKE '%йло' OR 
     doctorLang.first_name LIKE '%йло%' OR 
     doctorLang.first_name LIKE 'йло%' OR 
     doctorLang.second_name LIKE '%йло' OR 
     doctorLang.second_name LIKE '%йло%' OR 
     doctorLang.second_name LIKE 'йло%' OR 
     doctorLang.third_name LIKE '%йло' OR 
     doctorLang.third_name LIKE '%йло%' 
    ) 

你原来WHERE条款,没有括号,被解释成这样:

WHERE 
    (
     doctorLang.city = 'Пловдив' AND 
     doctorLang.language = 'bg' AND 
     doctor.active = 1   AND 
     doctorLang.first_name LIKE '%йло' 
    ) 
    OR 
     doctorLang.first_name LIKE '%йло%' OR 
     doctorLang.first_name LIKE 'йло%' OR 
     ... 

在换句话说,如果即使涉及名称的条件之一是真实的,它也会导致所有行被返回,显然忽略了你的呃限制。

这里带回家的教训是AND有更高的优先或执行顺序比OR。但是我们可以通过使用括号强加任何我们想要的评估顺序。

+0

非常感谢! –

它正在为一个或病情反而 它像 城市=“东西” 或 名=“东西”

使用子查询,而不是

先取你正在寻找的小镇然后从该结果对你正在寻找

的名字希望它有助于