2014-06-13 4 views
-4

Voici ma requête MySQL qui ignore l'état de champ de catégorie, le résultat renvoie également les résultats d'autres catégories qui ne sont pas mentionnés dans la requête, voici ma déclaration de requête mysqlMySQL retourne un résultat erroné sur PHP recherche requête

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 

la déclaration sql ci-dessus renvoie le résultat de la catégorie 1 et 6 au lieu de 1, quelqu'un peut-il aider s'il vous plaît à ce sujet?

+0

Vous sélectionnez '*' qui sélectionne tout dans les deux tables. Si vous voulez seulement tout des petites annonces, vous devriez utiliser 'classifieds. *' – James

+9

Vous mélangez les clauses 'and' et' or', ce qui conduira DEFINITIVEMENT à des résultats incorrects, à moins que vous sachiez EXACTEMENT ce que vous faites et compreniez mysql's règles de priorité d'opérateur: http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html –

+0

Ou simplement changer cette ligne 'category = 1' à' category = 1 AND category! = 6'. – JakeGould

Répondre

0

Essayez d'ajouter des parenthèses dans la clause WHERE. ET a une priorité supérieure OU (visite 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 


Si cela est dans la clause WHERE par exemple

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

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

Lorsque row3 est égal à 3, alors row1 pourrait être quelque chose - c'est votre cas.

+0

Ajouter plus d'informations. – Tulon

0

Vous avez 4 groupes de conditions connectés par l'opérateur OU et seul le premier groupe a la condition 'catégorie = 1'. Vous avez besoin de plus de supports si vous voulez obtenir seulement de la première catégorie. Comme

where category=1 AND (rest of conditions) 
0

Il y a un ordre de priorité dans les AND et OR opérations booléennes.

Tenir compte:

false AND (false OR true) => false 

contre

(false AND false) OR true => true 

MySQL est pas indéterminée lorsque vous spécifiez

false AND false OR true 

MySQL a un ordre spécifique de priorité, nous sommes assurés que L'ET ou l'OR sera évalué en premier.

Nous pouvons utiliser parens à spécifier l'ordre que MySQL devrait évaluer les opérations.

Questions connexes