IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

requêtes et ET OU SAUF


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut requêtes et ET OU SAUF
    Bonjour à tous,

    J’ai un formulaire de recherche pour rechercher des images et les informations qui les concernent (leurs notices), qui propose deux champs de saisies, avec, entre les deux, une liste déroulante proposant les choix : ET OU SAUF.
    Lorsque des mots sont saisies et que l’opérateur est choisi dans la liste, l’utilisateur clique sur valider, ce qui génère ma requête.
    J’arrive à gérer sans problème si l’opérateur est ET ou OU mais je n’arrive pas à générer une requête si l’opérateur est SAUF.

    Je pensais qu’il fallait utiliser NOT LIKE mais je n’arrive pas à avoir des résultats qui conviennent à chaque fois avec ceci.
    Quelqu’un pourrait –il me dire comment je peux faire ça ? ?

    Merci d’avance.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    if(!empty($_POST["saisie1"]))  {
    	$psaisie1=stripslashes($_POST["saisie1"]);
    	$saisie1=addslashes($psaisie1);
    	$saisie1=explode(" ", $saisie1);
    	$passage=0;
    	while(list( ,$premiersaisie1) = each($saisie1))
    	{
    		foreach ($motsvides as $key=>$value) {
    			$premiersaisie1 = eregi_replace("$value", "", "$premiersaisie1");
    		}
    		if ((($premiersaisie1) != "") && ($premiersaisie1) != " ") 
    		{
    			$premiersaisie1=addslashes($premiersaisie1); 
    			if($passage) $requetesaisie1 .= " AND ";
     
    	$requetesaisie1 .= "(C.nom LIKE '%$premiersaisie1%'"
    	. " OR IMP.nomimprimeur LIKE '%$premiersaisie1%' OR ED.nomediteur LIKE '%$premiersaisie1%'"
    	. " OR I.titre LIKE '%$premiersaisie1%' OR I.soustitre LIKE '%$premiersaisie1%'"
    	. " OR I.legende LIKE '%$premiersaisie1%')";
     
     
    		$passage=1;
    		}
    	}
    	if (!empty($_POST["saisie2"]))  {
    		$psaisie2=stripslashes($_POST["saisie2"]);
    		if (($_POST["listeetousauf1"])=="et1") {
    			$booleen1 = " AND ";
    		}
    		if (($_POST["listeetousauf1"])=="ou1") {
    			$booleen1 = " OR ";
    		}
    		if (($_POST["listeetousauf1"])=="sauf1") {
    			$booleen1 = " AND ";
    		}
     
    		$saisie2=addslashes($psaisie2);
    		$saisie2=explode(" ", $saisie2);
    		$passage=0;
    		while(list( ,$premiersaisie2) = each($saisie2))
    		{
    			foreach ($motsvides as $key=>$value) {
    		$premiersaisie2 = eregi_replace("$value", "", "$premiersaisie2");
    			}
    	if ((($premiersaisie2) != "") && ($premiersaisie2) != " ") 
    			{
    	$premiersaisie2=addslashes($premiersaisie2);
    	if($passage) $requetesaisie2 .= " AND ";
    	if ((($_POST["listeetousauf1"])=="et1") || (($_POST["listeetousauf1"])=="ou1")) {
    													$requetesaisie2 .= "(C.nom LIKE '%$premiersaisie2%'"
    	. " OR IMP.nomimprimeur LIKE '%$premiersaisie2%' OR ED.nomediteur LIKE '%$premiersaisie2%'"
    	. " OR I.titre LIKE '%$premiersaisie2%' OR I.soustitre LIKE '%$premiersaisie2%'"
    	. " OR I.legende LIKE '%$premiersaisie2%')";
     
    					}
    				$passage=1;
    			}
    		$finrequete2 = "$booleen1 $requetesaisie2";
    		}
     
     
    }
    	}	
    $finrequete = "AND ($requetesaisie1 $finrequete2 $finrequete3)";
    }
     
     
    if ($_POST['submitvalider'] != '') {
     
    if ($finrequete)  {
     
    		$requete="SELECT I.titre, …I.soustitre, I.legende,"
    	. " FROM images as I  LEFT JOIN collections as C ON I.idCOLL=C.id"
    	. " LEFT JOIN impression as IMP ON I.idIMP=IMP.id"
    	. " LEFT JOIN edition as ED ON I.idED=ED.id"
    	. " LEFT JOIN categories as CAT ON I.idCAT=CAT.id"
    	. " WHERE 1 $finrequete $orderby";
    	}

  2. #2
    m@
    m@ est déconnecté
    Membre expérimenté
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Par défaut
    AND NOT
    non ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    Et comment je dois l'utiliser?

  4. #4
    m@
    m@ est déconnecté
    Membre expérimenté
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Par défaut
    je pense que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          if (($_POST["listeetousauf1"])=="sauf1") {
             $booleen1 = " AND NOT ";
          }
    est suffisant, mais je n'ai pas lu ton code en entier

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    En fait j’arrive à générer une requête avec un NOT LIKE lorsque la requête se fait sur un seul champ mais à partir de deux, je n’ai plus de réponses.
    Mais j’ai peut être mal utilisé le NOT LIKE… ? ?

    Merci d’avance.

    Ca, ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (($_POST["laliste2"])=="liste2titre") {
    		if ((($_POST["listeetousauf1"])=="et1") || (($_POST["listeetousauf1"])=="ou1")) {
    			$requetesaisie2 .= "I.titre LIKE '%$premiersaisie2%'";
    							}
    		if (($_POST["listeetousauf1"])=="sauf1") {
    			$requetesaisie2 .= "I.titre NOT LIKE '%$premiersaisie2%'";
    							}
    						}
    Mais ça, ça ne marche pas : (j’ai aussi essayé un AND à la place du OR et de mettre des parenthèses…mais ça n’a rien changé…)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (($_POST["laliste2"])=="liste2date") {
    		if ((($_POST["listeetousauf1"])=="et1") || (($_POST["listeetousauf1"])=="ou1")) {
    			$requetesaisie2 .= "I.dateimpression LIKE '%$premiersaisie2%' OR I.dateedition LIKE '%$premiersaisie2%'";
    							}
    		if (($_POST["listeetousauf1"])=="sauf1") {
    			$requetesaisie2 .= "I.dateimpression NOT LIKE '%$premiersaisie2%' OR I.dateedition NOT LIKE '%$premiersaisie2%'";
    							}
    						}

  6. #6
    m@
    m@ est déconnecté
    Membre expérimenté
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Par défaut
    où as-tu essayé de mettre des parenthèses ?
    peux-tu faire un echo de tes requêtes ?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    J'ai essayé :

    if (($_POST["listeetousauf1"])=="sauf1") {
    $requetesaisie2 .= "(I.dateimpression NOT LIKE '%$premiersaisie2%' OR I.dateedition NOT LIKE '%$premiersaisie2%')";
    }



    if (($_POST["listeetousauf1"])=="sauf1") {
    $requetesaisie2 .= "(I.dateimpression NOT LIKE '%$premiersaisie2%' AND I.dateedition NOT LIKE '%$premiersaisie2%')";
    }


    Pour info, avant ma requête il y a un "AND"

  8. #8
    m@
    m@ est déconnecté
    Membre expérimenté
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Par défaut
    peux-tu afficher ta requête en entier ?


    au niveau des parenthèses ça doit plutôt être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (($_POST["listeetousauf1"])=="sauf1") {
    $requetesaisie2 .= "(I.dateimpression NOT LIKE '%$premiersaisie2%') AND (I.dateedition NOT LIKE '%$premiersaisie2%')";
    }

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    Ma requête (elle est tout en haut des messages) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $requete="SELECT I.titre, …I.soustitre, I.legende," 
       . " FROM images as I  LEFT JOIN collections as C ON I.idCOLL=C.id" 
       . " LEFT JOIN impression as IMP ON I.idIMP=IMP.id" 
       . " LEFT JOIN edition as ED ON I.idED=ED.id" 
       . " LEFT JOIN categories as CAT ON I.idCAT=CAT.id" 
       . " WHERE 1 $finrequete $orderby";

    Et les parenthèses n'ont rien changé, pourtant ma requête est acceptée, mais elle ne donne pas de résultats.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    J'ai abrégé les champs dans ma requ^te, normalement il y en a plus... y compris I.dateimpression et I.dateedition...

  11. #11
    m@
    m@ est déconnecté
    Membre expérimenté
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Par défaut
    j'ai bien vu ton code, mais en fait il faudrait que tu affiches avec un echo une requête d'exemple, correpondant à ce que tu envoies à mysql_query() pour que l'on puisse se rendre compte d'une faute de syntaxe qu'il est difficile de repérer ici.

    donc avant de faire tu fais et tu copies ce qui s'affiche sur le forum

    cordialement

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    Par exemple,

    cette requête me donne des résultats (et les bons):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT I.titre, I.soustitre, I.dateimpression, I.dateedition, I.technique, I.format, I.numinventaire, I.coteopac, I.legende, I.lieuimpression, I.lieuedition, I.pays, I.sujet, I.cheminimage, C.nom, IMP.nomimprimeur, ED.nomediteur, CAT.nomcateg 
    FROM images as I LEFT JOIN collections as C ON I.idCOLL=C.id LEFT JOIN impression as IMP ON I.idIMP=IMP.id LEFT JOIN edition as ED ON I.idED=ED.id LEFT JOIN categories as CAT ON I.idCAT=CAT.id 
    WHERE 1 AND ((C.nom LIKE '%titre%' OR IMP.nomimprimeur LIKE '%titre%' OR ED.nomediteur LIKE '%titre%' OR I.titre LIKE '%titre%' OR I.soustitre LIKE '%titre%' OR I.dateimpression LIKE '%titre%' OR I.dateedition LIKE '%titre%' OR I.lieuimpression LIKE '%titre%' OR I.lieuedition LIKE '%titre%' OR I.pays LIKE '%titre%' OR I.technique LIKE '%titre%' OR CAT.nomcateg LIKE '%titre%' OR I.format LIKE '%titre%' OR I.sujet LIKE '%titre%' OR I.numinventaire LIKE '%titre%' OR I.coteopac LIKE '%titre%' OR I.legende LIKE '%titre%') AND I.titre NOT LIKE '%attendant%' ) 
    ORDER BY IMP.nomimprimeur, ED.nomediteur
    et celle ci ne m'en donne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT I.titre, I.soustitre, I.dateimpression, I.dateedition, I.technique, I.format, I.numinventaire, I.coteopac, I.legende, I.lieuimpression, I.lieuedition, I.pays, I.sujet, I.cheminimage, C.nom, IMP.nomimprimeur, ED.nomediteur, CAT.nomcateg 
    FROM images as I LEFT JOIN collections as C ON I.idCOLL=C.id LEFT JOIN impression as IMP ON I.idIMP=IMP.id LEFT JOIN edition as ED ON I.idED=ED.id LEFT JOIN categories as CAT ON I.idCAT=CAT.id 
    WHERE 1 AND ((C.nom LIKE '%titre%' OR IMP.nomimprimeur LIKE '%titre%' OR ED.nomediteur LIKE '%titre%' OR I.titre LIKE '%titre%' OR I.soustitre LIKE '%titre%' OR I.dateimpression LIKE '%titre%' OR I.dateedition LIKE '%titre%' OR I.lieuimpression LIKE '%titre%' OR I.lieuedition LIKE '%titre%' OR I.pays LIKE '%titre%' OR I.technique LIKE '%titre%' OR CAT.nomcateg LIKE '%titre%' OR I.format LIKE '%titre%' OR I.sujet LIKE '%titre%' OR I.numinventaire LIKE '%titre%' OR I.coteopac LIKE '%titre%' OR I.legende LIKE '%titre%') AND (IMP.nomimprimeur NOT LIKE '%jean%') AND (ED.nomediteur NOT LIKE '%jean%') ) 
    ORDER BY IMP.nomimprimeur, ED.nomediteur

  13. #13
    m@
    m@ est déconnecté
    Membre expérimenté
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Par défaut
    et si tu remets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMP.nomimprimeur NOT LIKE '%jean%'
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ED.nomediteur NOT LIKE '%jean%'
    dans la première requête tu as bien les bons résultats ?

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    oui, j'ai les bons résultats...

  15. #15
    m@
    m@ est déconnecté
    Membre expérimenté
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Par défaut
    continuons à tâtons, si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT... WHERE (IMP.nomimprimeur NOT LIKE '%jean%') AND (ED.nomediteur NOT LIKE '%jean%')
    qu'est-ce que ça donne ?

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    ça marche pas...

  17. #17
    m@
    m@ est déconnecté
    Membre expérimenté
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Par défaut
    as-tu essayé de faire une requuête plus simple avec juste une conditiion de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT... WHERE (qqc NOT LIKE '%jean%') AND (autrechose NOT LIKE '%jean%')
    ?

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    En faisant ce test j'ai compris d'ou venait le problème; c'est que lorsque j'interroge avec un not like par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...WHERE (ED.nomediteur NOT LIKE '%jean%')
    il ne me donne que les réponses qui correspondent à ça et seulement lorsque le champ est rempli, si le champ est vide, il considère apparemment que c'est comme si la notice ne correspondait pas au critère, donc, comme dans ma base j'ai beaucoup de champ non rempli, ça m'élimine toujours des tas de réponses... et souvent quand j'ajoute 2 NOT LIKE il n'y a plus de réponses qui correspondent...

    Mais c'est peut être possible de ne pas éliminer lorsque les champs ne sont pas rempli?

  19. #19
    m@
    m@ est déconnecté
    Membre expérimenté
    Avatar de m@
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 143
    Par défaut
    enfin une piste !

    essaye de mettre tes colonnes en NOT NULL. si ça te pose des problèmes, il faut alors que tu transformes ta requête en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...WHERE ((ED.nomediteur NOT LIKE '%jean%') OR (IS NULL ED.nomediteur))
    ce qui suppose que tous les champs null remplissent tes critères de NOT LIKE.

    c'est du au fait que tous les tests effectués sur NULL renvoient NULL quels qu'ils soient, ainsi CONCAT('salut', NULL) renvoie NULL

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    J'ai donc passé tous mes champs en NOT NULL mais j'ai l'impression que ça n'a rien changé.

    J'ai refait un test et il y a un truc que je comprends pas :

    Dans ma base j'ai encore pas beaucoup de notices et d'images, ce qont que des trucs pour faire des test. Le champ ED.nomediteur n'a que 2 ponses : "Truc Machin" et "Machin Chose"

    Si je fais cette requête (="titre" sauf "truc") :
    SELECT ... FROM images as I LEFT JOIN collections as C ON I.idCOLL=C.id LEFT JOIN impression as IMP ON I.idIMP=IMP.id LEFT JOIN edition as ED ON I.idED=ED.id LEFT JOIN categories as CAT ON I.idCAT=CAT.id
    WHERE 1 AND ((C.nom LIKE '%titre%' OR IMP.nomimprimeur LIKE '%titre%' OR ...) AND ED.nomediteur NOT LIKE '%truc%';

    Je n'ai qu'une réponse : la notice ou le nom de l'éditeur est "Machin Chose", et ça je comprends pas parce que j'ai des autres notices ou le nom de l'editeur n'est pas saisi et il ne les prend pas dans ces résultats.
    Mais je voudrais que ces notices là fassent partie des réponses. En plus, c'est pour cette raison que j'ai rapidement plus de réponses à mes requêtes mais c'est dommage parce que m^me dans la future base ou il y aura plus de 3000 notices tous les champs ne seront pas forcement rempli...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/09/2011, 17h27
  2. Réponses: 1
    Dernier message: 07/11/2009, 13h02
  3. [MySQL] Requête Select sauf un enregistrement
    Par sasaas dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/02/2008, 17h12
  4. Réponses: 3
    Dernier message: 21/05/2007, 17h34
  5. [Requête/SQL]selection toutes colonnes sauf une
    Par alcabk dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 17/04/2007, 09h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo