我很谦虚地问,我的两个查询显示不同的结果。在两个查询中,我都传递了两个错误的值(城市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%'
有人能指导我为什么会这样吗?我很感激。如果我有任何错误,我非常抱歉。
答案 0 :(得分:2)
将and
和or
混合使用的方式表明您并不完全了解他们的precedence。 AND
的优先级高于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