Requête MySQL : AND puis OR

Eléphanteau du PHP | 22 Messages

11 févr. 2009, 17:40

Bonjour à tous,

Je cherche une solution pour rechercher dans une base de donnée avec OR puis avec AND si aucun résultat n'a été proposé. Et cela pour trois champs.

Exemple :

Code : Tout sélectionner

SELECT * FROM base WHERE champ1 LIKE "test" AND champ2 LIKE "vivelephp" AND champ3 LIKE "phpfrance"
Puis si rien n'est retourné :

Code : Tout sélectionner

SELECT * FROM base WHERE champ1 LIKE "test" AND champ2 LIKE "vivelephp" OR champ3 LIKE "phpfrance"
Puis :

Code : Tout sélectionner

SELECT * FROM table WHERE champ1 LIKE "test" OR champ2 LIKE "vivelephp" OR champ3 LIKE "phpfrance"
Voici la base de données :

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `champ1` text NOT NULL, `champ2` text NOT NULL, `champ3` text NOT NULL, ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Merci d'avance pour votre aide :)
Modifié en dernier par SiMax le 11 févr. 2009, 18:36, modifié 1 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

11 févr. 2009, 18:34

Apparemment, tu n'as pas compris le fonctionnement de l'opérateur AND dans la clause WHERE. :(
SELECT *
FROM  base
WHERE champ LIKE "test"
  AND champ LIKE "vivelephp"
  AND champ LIKE "phpfrance" 
Cette requête ne te retournera rien car :
- LIKE nécessite l'usage du caractère générique % (sinon c'est une égalité stricte que tu recherches)
- Le champ "champ" ne peut avoir à la fois la valeur test, la valeur vivelephp et la valeur phpfrance
SELECT champ      // évite le SELECT *
FROM  table       // et non "base"
WHERE champ LIKE '%test%'
   OR champ LIKE '%vivelephp%'
   OR champ LIKE '%phpfrance%' 

Eléphanteau du PHP | 22 Messages

11 févr. 2009, 18:38

Je suis désolé pour les champs et pour les %, j'ai mis cela arbitrairement :)

Je connais l'utilisation de LIKE et des jokers "%" :)

Pour revenir à ma question, est-ce possible ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 févr. 2009, 21:47

Y'a-t-il une raison particulière (et une bonne) pour ne pas faire 2 requêtes ?

Si aucun résultat avec AND, alors requête avec OR...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

11 févr. 2009, 22:53

Voici une analyse des conditions posées comme règles de fonctionnement de la requête.

On commence par donner des noms de code pour les expressions logiques:
Soit A : champ1 LIKE "test"
Soit B : champ2 LIKE "vivelephp"
Soit C : champ3 LIKE "phpfrance"

Remarque: L'opérateur LIKE ici joue le même rôle que l'opérateur = puisque le caractère générique % n'est pas employé dans les chaines de valeurs.

Construisons maintenant les conditions:
  • 1° condition : A et B et C
    2° condition : si la 1° règle est fausse, A et B ou C = NON(A et B et C) et (A et B ou C)
    3° condition : si la 2° règle est fausse, A ou B ou C = NON( NON(A et B et C) et (A et B ou C) ) et (A ou B ou C)
La condition finale doit donc combiner les 3 conditions par un OU.

Code : Tout sélectionner

SELECT * FROM table WHERE ( A AND B AND C ) OR ( NON(A AND B AND C) AND (A AND B OR C) ) OR ( NON( NON(A AND B AND C) AND (A AND B OR C) ) AND (A OR B OR C) )
Reste à remplacer, A, B et C par leurs valeurs.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 22 Messages

07 mars 2009, 20:36

Merci beaucoup :) Par contre, quand j'essaye cette requête :

Code : Tout sélectionner

SELECT * FROM partenariats WHERE (aff != 0) AND ((pagerank = '$pr' AND cat = '$cat') OR (pagerank = '$pr' AND cat != '$cat') OR (pagerank != '$pr' AND cat != '$cat')) ORDER BY pr DESC LIMIT 0,5
Ca m'affiche

Code : Tout sélectionner

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

07 mars 2009, 21:54

Tu dois vérifier si la requête retourne des résultats en l'exécutant directement sous phpMyAdmin avant de l'exécuter dans ton programme. fais un jeu d'essai et vois ce que ça donne.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 22 Messages

07 mars 2009, 22:38

Je n'ai pas bien compris la question là. Quand j'exécute cette requête sans les conditions, ça marche :

Code : Tout sélectionner

SELECT * FROM partenariats WHERE (aff != 0) ORDER BY pr DESC LIMIT 0,5