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

Langage SQL Discussion :

Requête multi-critères


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut Requête multi-critères
    Bonjour

    J'aimerai faire évoluer ma requête multicritère (fournit par Celira - merci).

    Je peux via ma requête comparer des données de ma BDD à la recherche multicritères de l'utilisateur.
    ex : cherche M. Dupont (fixe) - Masculin (fixe) - Année de naissance (fixe) => résultat de la requête

    Cependant, aujourd'hui je suis confronté au problème suivant;

    J'ai un formulaire de suivi anthropométrique dans lequel je peux rentrer à différentes dates, l'évolution de la taille d'un contact.

    Contact 1 : (8 dates max)
    A une date1 => taille1
    A une date2 => taille2
    A une date 3 => taille3
    A une date4 => taille4
    A une date5 => taille5
    A une date6 => taille6
    A une date7 => taille7
    A une date8 => taille8


    Comment comparer le critère de recherche Taille de l'utilisateur avec le "dernier champ Taille" renseigné dans la BDD (évolutif)

    ex :

    if (!empty(taille8)) => comparer avec la taille saisie par l'utilisateur
    else (!empty(taille7)) => comparer avec la taille saisie par l'utilisateur
    else (!empty(taille6)).....


    form.php
    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
     
    <form action="post_form.php" method="post">
     
     <p> NOM : <input type="text" name="nom" id="nom"></p>
     
     <label for="sexe">SEXE</label> 
      <select id="sexe" name="sexe"> 
       <option></option>
       <option>MASCULIN</option>
       <option>FEMININ</option>
      </select></p>
     
     
     <table class="table_anthropo">
     
      <tr>
       <td class="titre_anthropo">Date</td>
       <td class="titre_anthropo">Taille</td>
      </tr>
     
      <tr>
       <td><input  type="date" id="date1" name="date1"></td>
       <td><input  type="number" id="taille1" name="taille1"></td>	
      </tr>
     
      <tr>
       <td><input  type="date" id="date2" name="date2"></td>
       <td><input  type="number" id="taille2" name="taille2"></td>	
      </tr>
     
      <tr>
       <td><input  type="date" id="date3" name="date3"></td>
       <td><input  type="number" id="taille3" name="taille3"></td>	
      </tr>
     
     </table>
     
     <p><input type="submit" name="envoyer" value="envoyer"></p>
     
    </form>

    form_SearchMulti.php
    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
     
    <form action="Search.php" method="post">
     
    <h1> RECHERCHE MULTICRITERES </h1>
     
    <p> <label for="nom"> NOM : </label> <input type="text" name="nom" id="nom" placeholder="MAJUSCULE"/></p>
    <p>
     <p><label for="H"> HOMME : </label> <input type="radio" name="sexe" value="H" id="H"/>
     <label for="F"> FEMME : </label> <input type="radio" name="sexe" value="F" id="F"/></p> 
    </p>
    <p> <label for="taille"> TAILLE SUPERIEURE A : </label><input type="text" name="taille" id="taille"/></p>  // A COMPARER AVEC LA DERNIERE DATE SAISIE DANS LA BDD
     
    <p><input type="submit" name="envoyer" value="RECHERCHER"/>
    <p><input type="reset" name="effacer" value="RESET"/></p>
     
    </form>


    ContactManager.php
    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
    <?php
    
    class ContactManager {
    
    //.......
     
     public function search(contact $contact) {
          
      $sql_select = "SELECT * FROM joueur";
                 
      $criteres = [];
      $params = [];
                 
     if (!empty($_POST['nom'])) {
       // on crée un critère sur la colonne nom
       $criteres[] = " nom= :nom";
       $params[':nom'] = $_POST['nom'];
      }
                 
     if (!empty($_POST['sexe'])) {
       // on crée un critère sur la colonne sexe
       $criteres[] = " sexe= :sexe";
       $params[':sexe'] = $_POST['sexe'];
      }
               
     if (!empty($_POST['taille'])) {     
      
      $criteres[] = " ...?.... >= :taille";   COMMENT FAIRE POUR OBTENIR LA DERNIERE TAILLE SAISIE DANS LA BDD
      $params[':taille'] = $_POST['taille'];
     }
    
     // on concatène 
    
     $sql_where = '';
     if (!empty($criteres)) {
      $sql_where .= ' WHERE '.implode(' AND ', $criteres);
     }
     
     $this->pdoStatement = $this->pdo->prepare($sql_select.$sql_where);
    
     $executeIsOK = $this->pdoStatement->execute($params);
                 
     $contacts = [];
    
     while ($contact = $this->pdoStatement->fetchObject('Contact')) { 
      $contacts [] = $contact; // tableau des contacts renseignés par la variable $contact (les contacts trouvés)
     }
     return $contacts; 
     }
    
    }



    Search.php
    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
    79
    80
     
    <?php
     
    var_dump($_POST); 
     
    //require_once '../CLASS/Contact.php';
    //require_once '../CLASS/ContactManager.php';
     
    //$contact = new Contact();
    //contactManager = new ContactManager();
     
    //$contacts = $contactManager->search($contact);
     
     
    ?>
     
    <!DOCTYPE html>
     
    <html lang='fr'>
     
     
    <head>
     <meta charset="utf-8">
     <title> LISTE DE TOUS LES CONTACTS </title>
    </head>
     
    <body>
     
    <h1> RESULTAT DE LA RECHERCHE MULTICRITERES </h1>
     
    <?php if (empty($contacts)): ?>
     
     <p> Il n'y a aucun contact à afficher </p> 
     
      <?php else: ?>
     
       <?php if($contacts === false): ?>
     
        <p> Une erreur est survenue </p>
     
     
       <?php else: ?>
     
        <table >
     
         <thead>
     
          <tr>
           <th>NOM</th>
           <th>SEXE</th>
           <th>TAILLE</th>
          </tr>
         </thead>
     
         <tbody>
     
     
         <?php 
     
         $i=0;
         foreach ($contacts as $contact) {
          echo '<tr class="ligne'.($i % 2).'">';
          echo( "<td>".$contact->getNom()."</td>" );
          //echo( "<td>".$contact->getTaille()."</td>" );
          echo( "</tr>" );
     
          $i++; 
         }
         ?>    
         </tbody>                
     
        </table>
     
      <?php endif; ?>		
     
    <?php endif; ?>		
     
    </body>
     
    </html>

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    La recherche du premier/dernier/plus ancien/plus récent est une demande récurrente, une petite recherche te permettra certainement de trouver comment faire.
    Par contre cela implique que les tables soient modélisées correctement, or j'ai un petit doute ici.
    Peux-tu nous montrer le schéma de la/des tables(s) concernée(s) ici ?

    Tatayo.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    merci pour votre retour....j'ai cherché avec les mots clés demande récurrente SQL, Max,....rien de concluant..

    j'ai contourné le problème avec un switch qui me renvoie la dernière valeur saisie dans mon tableau Anthropo du coup ma requête fonctionne puisque je récupère une seule donnée

    Certainement pas propre du tout mais pour l'instant cela fonctionne et je fais avec mes compétences....

    Mais par curiosité j'aimerai trouver un tuto qui montre comment faire si je devais avoir à nouveau ce problème...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Je confirme ce qu'a écrit tatayo :
    Sans connaitre la structure de la table, il n'est pas possible de t'aider à construire la requête dont tu as besoin.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    En fait c'est assez simple.
    On part du principe que la dernière ligne, c'est celle pour laquelle il n'en existe pas de plus récente.
    Ca ressemble à une Lapalissade, mais ça donne la piste à suivre.
    Ensuite il existe plusieurs méthodes, avec un NOT EXIST, une jointure externe…
    Exemple:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.*
    from MaTable as t2
    left outer join MaTable as t2 on t2.DateSaisie > t1.DateSaisie 
    where t2.id is null
    Pour chercher "le plus grand", c'est le même principe:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.*
    from MaTable as t2
    left outer join MaTable as t2 on t2.Longueur > t1.Longueur 
    where t2.id is null

    Dans ton cas il suffit donc de comparer la date de saisie pour avoir le dernier.
    Mais mon petit doigt me dit que tu as 8 colonnes date et 8 colonnes taille sur une seule ligne. Dans ce cas ça ne fonctionne pas… Mais ce n'est pas du tout ainsi qu'il faut modéliser la table !
    D'où la difficulté de trouver la bonne requête. En modélisant correctement, la recherche devient bien plus facile (et potentiellement plus rapide en fonction des indexes présents).

    Tatayo.

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    MERCI
    resolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] requête multi-critère timestamp
    Par pp_le_moko dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/01/2010, 10h59
  2. [AC-2007] Requête multi critères
    Par vitoje7 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/09/2009, 19h32
  3. [SQL] Créer Requête Multi-Critères
    Par ArHacKnIdE dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/04/2008, 14h13
  4. requête multi-critère parametrable
    Par milady dans le forum Oracle
    Réponses: 7
    Dernier message: 25/09/2006, 14h08
  5. [Access-VBA] Requête multi-critère/Formulaire en mode continu
    Par adriano057 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/08/2006, 10h07

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