Requête MySQL : AND puis OR

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Requête MySQL : AND puis OR

par SiMax » 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

par sadeq » 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.

par SiMax » 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 ...

par sadeq » 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.

par ouckileou » 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...

par SiMax » 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 ?

par albat » 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%' 

Requête MySQL : AND puis OR

par SiMax » 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 :)