2014-06-13 131 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應該評估操作的順序。