priorité entre AND et OR dans une requete

Eléphant du PHP | 93 Messages

24 févr. 2007, 10:09

Bonjour à tous,

voilà, j'ai un souci de priorité dans une requete entre OR et AND.

Je faisais cette requete-là :
			    //on regarde s'il y a une ou plusieurs unités amies autour de l'unité attaquée, à 1 case de distance.
			    $sql = "SELECT per_image FROM carte_perso 
			    where 
			    per_x=($xunitedef+1) or per_x='$xunitedef' or per_x=($xunitedef-1) 
			    and per_y=($yunitedef+1) or per_y='$yunitedef' or per_y=($yunitedef-1)
			    and per_image='fantassins' or per_image='snipers' or per_image='terrestres' or per_image='aeriens' 
			    and bataille='$bataille'";
Mon objectif étant de compter les unités se trouvant à une case de distance et étant amies, donc, de compter avec le AND prioritaire sur le OR :
compter unité
quand per_x correspond à une des coordonées données ( OR )
ET
quand per_y correspond à une des coordonnées données ( OR )
ET
quand l'image correspond à une des images données. ( OR )

Je viens de comprendre pourquoi ça me comptait toujours 15 ou 20 unités.
Le OR est donc prioritaire sur le AND, ou ma manière de présenter la requête le met prioritaire...

Ainsi, cette requête fait le contraire de ce que je voulais.
Je peux le voir en la décomposant logiquement ainsi :
			    //on regarde s'il y a une ou plusieurs unités amies autour de l'unité attaquée, à 1 case de distance.
			    $sql = "SELECT per_image FROM carte_perso 
			    where 
			    per_x=($xunitedef+1) 
			    or 
			    per_x='$xunitedef' 
			    or per_x=($xunitedef-1) and per_y=($yunitedef+1) 
			    or per_y='$yunitedef' 
			    or per_y=($yunitedef-1) and per_image='fantassins' 
			    or per_image='snipers' 
			    or per_image='terrestres' 
			    or per_image='aeriens' 
			    and bataille='$bataille'";
Ma question est donc la suivante :

comment puis-je formuler cette requête pour que le AND soit prioritaire sur le OR et que ma recherche aboutisse comme je le désire ?

Merci d'avance... :wink:

Eléphant du PHP | 93 Messages

24 févr. 2007, 10:31

Comme souvent, d'avoir exposé le problème met en lumière une solution, et j'ai donc fait le code suivant :
			    //on regarde s'il y a une ou plusieurs unités amies autour de l'unité attaquée, à 1 case de distance.
			    $sql = "SELECT per_image FROM carte_perso 
			    where 
			    per_x>=($xunitedef-1) and per_x<=($xunitedef+1) and  per_y>=($yunitedef-1) and per_y<=($yunitedef+1) and per_image='fantassins' and bataille='$bataille'
			    or 
			    per_x>=($xunitedef-1) and per_x<=($xunitedef+1) and  per_y>=($yunitedef-1) and per_y<=($yunitedef+1) and per_image='snipers' and bataille='$bataille'
			    or 
			    per_x>=($xunitedef-1) and per_x<=($xunitedef+1) and  per_y>=($yunitedef-1) and per_y<=($yunitedef+1) and per_image='terrestres' and bataille='$bataille' 
			    or 
			    per_x>=($xunitedef-1) and per_x<=($xunitedef+1) and  per_y>=($yunitedef-1) and per_y<=($yunitedef+1) and  per_image='aeriens' and bataille='$bataille'
			    ";
Cela semblait fonctionner, car d'un coup, je n'avais plus des 15 ou 20 unités repérées, et lors de mes deux premières tentatives, ça a bien repéré une unité à proximité.
Mais alors que je continue les tests, je m'aperçois que ce code-ci ne retrouve pas toutes les unités à proximité, à un moment, il y en a 5, et ça ne me les indique pas toutes...

Quelqu'un voit-il où se situe le problème cette fois-ci ?

Merci d'avance.

PS : pour info, dans MySQL, la requete qui semble fonctionner donne ceci :
SELECT * 
FROM carte_perso
WHERE per_x >= ( 4 -1 ) 
AND per_x <= ( 4 +1 ) 
AND per_y >= ( 7 -1 ) 
AND per_y <= ( 7 +1 ) 
AND per_image = 'fantassins'
AND bataille = 'bataille2'
OR per_x >= ( 4 -1 ) 
AND per_x <= ( 4 +1 ) 
AND per_y >= ( 7 -1 ) 
AND per_y <= ( 7 +1 ) 
AND per_image = 'snipers'
AND bataille = 'bataille2'
OR per_x >= ( 4 -1 ) 
AND per_x <= ( 4 +1 ) 
AND per_y >= ( 7 -1 ) 
AND per_y <= ( 7 +1 ) 
AND per_image = 'terrestres'
AND bataille = 'bataille2'
OR per_x >= ( 4 -1 ) 
AND per_x <= ( 4 +1 ) 
AND per_y >= ( 7 -1 ) 
AND per_y <= ( 7 +1 ) 
AND per_image = 'aeriens'
AND bataille = 'bataille2'
LIMIT 0 , 30;

Eléphant du PHP | 281 Messages

24 févr. 2007, 10:54

---
Modifié en dernier par Ouaibou le 07 juil. 2007, 11:09, modifié 1 fois.

Eléphant du PHP | 93 Messages

24 févr. 2007, 10:59


Merci.
Sinon, mes tests dans ma table m'ont fait mettre à jour mon erreur.

:oops: C'était simplement que je cherchais les images correspondant aux unités attaquantes, et non aux unités défensives, donc évidemment, les résultats s'inversent... :oops:
Le problème était donc bien résolu avec le nouveau code.

Merci pour ton aide et pour l'économie des lignes :wink: