Page 1 sur 1

Requête MySQL : AND puis OR

Posté : 11 févr. 2009, 17:40
par SiMax
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 :)

Posté : 11 févr. 2009, 18:34
par albat
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%' 

Posté : 11 févr. 2009, 18:38
par SiMax
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 ?

Posté : 11 févr. 2009, 21:47
par ouckileou
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...

Posté : 11 févr. 2009, 22:53
par sadeq
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.

Posté : 07 mars 2009, 20:36
par SiMax
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 ...

Posté : 07 mars 2009, 21:54
par sadeq
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.

Posté : 07 mars 2009, 22:38
par SiMax
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