查询返回所有行

时间:2017-06-19 13:06:14

标签: mysql

为什么此查询会返回符合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 '%йло%'

2 个答案:

答案 0 :(得分: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
        ...

换句话说,即使涉及该名称的OR条件之一为真,也会导致返回所有行,显然忽略了您的其他限制。

此处的主页课程是AND具有比OR更高的优先级或执行顺序。但是我们可以使用括号来强加任何我们想要的评估顺序。

答案 1 :(得分:1)

它实际上是为了一个或一个条件 就像是 城市=“东西” 要么 命名= '某物'

使用子查询

首先获取您正在寻找的城镇,然后从该结果获取您要查找的名称

希望有所帮助