为什么查询显示结果,但是大多数参数值是错误的?

时间:2018-08-08 11:29:08

标签: php mysql sql mysqli

我很谦虚地问,我的两个查询显示不同的结果。在两个查询中,我都传递了两个错误的值(城市ID并声明了它的值),但是当我执行时查询仍然显示返回一行。以下是显示行的查询,我希望它不应该

select * from `companies` where `city_id` = 3 and `state_id` = 4 and 
`company_name` LIKE '%en%' 
or `company_email` LIKE '%en%'
or `company_profile` LIKE '%en%'
order by `company_name` asc

以下查询不显示任何行,由于传递了错误的值,因此是预期结果

select * from `companies` where `city_id` = 3 and `state_id` = 4 and 
`company_name` LIKE '%en%' 
or `company_email` LIKE '%en%'
order by `company_name` asc

两个查询的唯一区别是子句

or `company_email` LIKE '%en%'

有人能指导我为什么会这样吗?我很感激。如果我有任何错误,我非常抱歉。

2 个答案:

答案 0 :(得分:2)

andor混合使用的方式表明您并不完全了解他们的precedenceAND的优先级高于OR,因此您的查询与这些查询等效:

where (
    `city_id` = 3
    and `state_id` = 4
    and `company_name` LIKE '%en%' 
)
or `company_email` LIKE '%en%'
or `company_profile` LIKE '%en%'
where (
    `city_id` = 3
    and `state_id` = 4
    and `company_name` LIKE '%en%' 
)
or `company_email` LIKE '%en%'

我认为您唯一的匹配是由于company_profile

答案 1 :(得分:0)

让我改一下自己。正如前面指出的,AND的优先级更高,但是,如果AND条件未返回结果,并且任何OR条件返回,则OR将接管您编写的所有其他内容。

截至目前,如果您设置的AND条件返回结果,则OR条件将被忽略。

要使其(显然)能够正常工作,您需要执行以下操作:

select 
    * 
from 
    `companies` 
where 
    `city_id` = 3 
and 
    `state_id` = 4 
and (
    `company_name` LIKE '%en%' 
    or `company_email` LIKE '%en%'
    or `company_profile` LIKE '%en%'
)
order by `company_name` asc