pb de requete like not like

Eléphant du PHP | 138 Messages

08 mars 2008, 18:32

Salut,

J'ai un soucis avec une requete sur ma table je dispose de 4 champs qui m'interessent
a_creer abandon en_cours en_veille dans une requete je veux prendre les données des personnes qui sont en_encours ou qui sont en_veille et ne pas prendre ceux qui on creer (a_creer) ou ceux qui ont abandonnés (abandon)

pour cela j'a essayer la requete suivante
$result=mysql_query("SELECT crea_accueil.id, crea_accueil.nom, crea_accueil.prenom FROM crea_accueil, crea_relance where crea_relance.a_creer NOT LIKE 'Y' || crea_relance.abandon NOT LIKE 'Y' || crea_relance.en_cours='Y' || crea_relance.en_veille='Y' and crea_accueil.id=crea_relance.id_accueil group by crea_accueil.id");
Mais ca me retour toujours toutes les données (j'ai une donnée de test ou a creer est sur Y et ca ne fonctionne pas grrrrrr
je m'arrache les cheveux la dessus qui pourrait m'aider ?? merci de votre aide

Eléphanteau du PHP | 28 Messages

08 mars 2008, 18:49

Salut logone,

Alors déjà dans ta requête, je comprend pas trop l'interêt d'utiliser LIKE sans utilisé ses jokers associés qui en font son intérêt (_ et %) ? Parce que das ton cas, un test d'égalité revient au même non ?

Pour ce qui est de ta selection, tu a bien posé ton problème en textuel mais tu l'a simplement mal retranscrit dans ta selection. Si j'ai bien compris ce que tu veux faire, ça devrait donner quelque chose comme ca (importante des parenthèses) :

Code : Tout sélectionner

$result=mysql_query("SELECT crea_accueil.id, crea_accueil.nom, crea_accueil.prenom FROM crea_accueil, crea_relance WHERE (crea_relance.a_creer != 'Y' AND crea_relance.abandon != 'Y') AND (crea_relance.en_cours='Y' OR crea_relance.en_veille='Y') AND crea_accueil.id = crea_relance.id_accueil GROUP BY crea_accueil.id");
Bonne journée !

Eléphant du PHP | 138 Messages

08 mars 2008, 19:03

Salut,

J'ai essayé ta requete mais ca ne donne rien de plus
Merci du coup de main en faite je pense que la requete se raproche plus de

Code : Tout sélectionner

$result=mysql_query("SELECT crea_accueil.id, crea_accueil.nom, crea_accueil.prenom FROM crea_accueil, crea_relance where (crea_relance.a_creer = 'N' || crea_relance.abandon = 'N' || crea_relance.en_cours='Y' || crea_relance.en_veille='Y') and crea_accueil.id=crea_relance.id_accueil group by crea_accueil.id");
Mais ca ne donne toujours rien
J'ai une ligne ou j'ai a_creer sur Y dons qui ne devrait pas apparaitre et elle apparait systematiquement bizarre.

Eléphanteau du PHP | 28 Messages

08 mars 2008, 19:20

Re-bonjour,
J'ai une ligne ou j'ai a_creer sur Y dons qui ne devrait pas apparaitre et elle apparait systematiquement bizarre.
Par rapport à ta requête, c'est normal :)
where (crea_relance.a_creer = 'N' || crea_relance.abandon = 'N' || crea_relance.en_cours='Y' || crea_relance.en_veille='Y')
Tu à mis des OR. C'est à dire que à partir du moment ou l'une de ces conditions est rempli, la ligne sera selectionnée.

crea_relance.a_creer peut très bien valoir Y à partir du moment ou au moins l'une des autres conditions est remplie !

Au contraire, avec l'opérateur AND, toutes les conditions doivent être validée !

Un exemple simple :

t'a une table animaux :

Animaux
----------
NOm | a_poils | a_cornes
chat | 1 | 0
Chien | 1 | 0
rhinoceros |1 | 1
Taureau | 1 | 1

0 : faux
1 : vrai

Si tu veux juste sélectionner les animaux à poils, tu fait :

Code : Tout sélectionner

WHERE a_poils = 1
Si tu veux juste sélectionner les animaux à cornes, tu fait :

Code : Tout sélectionner

WHERE a_cornes = 1
Si tu veux selectionner les animaux qui ont des cornes OU des poils (donc implicitement OU les deux) :

Code : Tout sélectionner

WHERE a_cornes = 1 OR a_poils = 1
(ici ca va tout sélectionner)

Si tu veux selectionner les animaux qui ont des cornes ET des poils :

Code : Tout sélectionner

WHERE a_cornes = 1 AND a_poils = 1
(juste le taureau).

Après, tu peux compliquer la chose en ayant plus de deux opérandes (a_queue ?) et en faisant des combinaisons avec des parenthèses :)

Le tout c'est de bien restranscrire ce que tu veux selectionner en textuel avant de le passer en SQL avec des opérateurs logique :)