2014-06-13 111 views
-4

这里是我的MySQL查询而忽略类别字段条件,结果也返回从其他类别未在查询结果可看出,这里是我的MySQL查询语句的MySQL返回PHP的搜索查询错误的结果

select *,classifieds.id as id 
from classifieds,classifieds_meta 
where 
    category=1 
    AND meta_key='vehicle_make' 
    and meta_value=2 
    OR meta_key='vehicle_make' 
    and meta_value=3 
    AND (meta_key='vehicle_mileage' and meta_value=9) 
    OR (meta_key='vehicle_mileage' and meta_value=10) 
    OR (meta_key='vehicle_mileage' and meta_value=11) 
    AND classifieds.id=classifieds_meta.classifieds_id 
GROUP BY classifieds.id 

上面的sql语句返回类别1和6的结果而不是1,有人可以帮忙吗?

+0

您正在选择将从两个表中选择全部的'*'。如果你只想要所有分类,你应该使用分类。*' – James

+9

你正在混合'和'和'或'子句,这将明确导致不正确的结果,除非你知道你在做什么,并理解mysql的运算符优先级规则:http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html –

+0

或者只是将此行'category = 1'更改为'category = 1 AND category!= 6'。 – JakeGould

回答

0

尝试在WHERE子句中添加圆括号。 的优先级高于OR(查看http://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html):

select *,classifieds.id as id 
from classifieds,classifieds_meta 
where 
    category=1 AND (
     meta_key='vehicle_make' 
     and meta_value=2 
     OR meta_key='vehicle_make' 
     and meta_value=3 
     AND (meta_key='vehicle_mileage' and meta_value=9) 
     OR (meta_key='vehicle_mileage' and meta_value=10) 
     OR (meta_key='vehicle_mileage' and meta_value=11) 
     AND classifieds.id=classifieds_meta.classifieds_id 
    ) 
GROUP BY classifieds.id 


如果这是在WHERE子句中例如

WHERE row1=1 AND row2=2 OR row3=3 

--equal to 
WHERE (row1=1 AND row2=2) OR row3=3 

当ROW3等于3,那么ROW1可以是任何东西 - 这是你的情况。

+0

添加更多信息。 – Tulon

0

您有4组条件由OR运算符连接,只有第一组具有'category = 1'条件。如果您只想从第一个类别获取,您需要更多的括号。像

where category=1 AND (rest of conditions) 
0

有优先在ANDOR布尔运算顺序。

考虑:

false AND (false OR true) => false 

(false AND false) OR true => true 

MySQL是不确定的,当你指定

false AND false OR true 

MySQL有优先级的特定顺序,我们都保证是否AND或OR将首先被评估。

我们可以使用parens到指定 MySQL应该评估操作的顺序。