2017-06-19 213 views
0

爲什麼此查詢返回與我的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

回答

3

這是你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

非常感謝! –

1

它正在爲一個或病情反而 它像 城市=「東西」 或 名=「東西」

使用子查詢,而不是

先取你正在尋找的小鎮然後從該結果對你正在尋找

的名字希望它有助於