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 sur plusieurs tables [MySQL-5.6]


Sujet :

Requêtes MySQL

  1. #21
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Findjo.

    Plusieurs problèmes.

    1) tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND tb51.NumJour = WEEKDAY(COALESCE('$date2',NOW()))+1
    Or $date2 est déjà une chaîne de caractères. Donc les apostrophes sont inutiles.
    A vrai dire, c'est plutôt des guillemets qu'il faut mettre, si c'est une concaténation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND tb51.NumJour = WEEKDAY(COALESCE(".$date2.",NOW()))+1
    Vérifier la syntaxe exacte !

    2) tu utilises ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $search = $con->prepare("SELECT tb01.IdCompagnie                AS 'IDComp Départ',
    Quand on utilises un "prepare", le passage des paramètres se fait soit par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $com->bindParam(":var",$var);
    mais dans ce cas là, dans la requête, tu dois mettre un ":var", plutôt qu'un "?".

    Si tu utilises plutôt le "?", dans ce cas là, c'est dans un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $con->execute(array(150, 'rouge'));
    où la liste des paramètres est positionnel.

    Ne fais pas une concaténation de la variable "$date2", si tu utilises le "prepare" dans ta requête.
    Je n'ai pas dit que c'est faux ce que tu fais, mais il faut rester homogène. C'est où l'un où l'autre mais pas les deux à la fois.

    3) le test en php me semble un peu bizarre. J'aurai tendance à écrire ceci :
    Code php : 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
    /*-------------*/
    /* Saisie date */
    /*-------------*/
     
    $_POST['date'] = '20/06/2016';
     
    /*-----------*/
    /* Test date */
    /*-----------*/
     
    $date  = NULL;
    $date2 = NULL;
     
    if (isset($_POST['date']))
    {
    	$test = $_POST['date'];
     
    	list($jour, $mois, $annee) = explode('/', $test);
     
    	if (checkdate($mois, $jour, $annee))
    	{
    		$time  = mktime(0, 0, 0, $mois, $jour, $annee);
    		$date  = date('d/m/Y', $time);
    		$date2 = date('Y-m-d', $time);
    	}
    }
     
    echo "date 1 : ".$date."\n";
    echo "date 2 : ".$date2."\n";
    Et à l'affichage, tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    date 1 : 20/06/2016
    date 2 : 2016-06-20
    Je l'ai testé, donc ça fonctionne !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  2. #22
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2013
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 66
    Points : 101
    Points
    101
    Par défaut
    Encore une fois merci beaucoup Artemus24 pour votre aide. Grace à vous il ne me reste pas grande chose à faire sur le projet seulement que j'ai un petit soucis avec une partie de ma requête.

    L'écran de recherche des voyages est la suivante:

    Nom : Capture.PNG
Affichages : 193
Taille : 550,9 Ko

    Selon ma requête, j'ai defini trois possibilités :

    1) Lorsque l'utilisateur renseigne uniquement la compagnie puis clique sur le bouton rechercher, le résultat est l'ensemble des voyages qu'effectue cette compagnie.

    2) Lorsque l'utilisateur renseigne uniquement la ville de départ et la ville d'arrivée puis clique sur le bouton rechercher, le résultat est l'ensemble des voyages qu'effectue toutes les compagnies de la base de données mais uniquement pour les villes concernées.

    Jusqu'à là j'ai aucun problème puisque tout fonctionne correctement.

    3) Lorsque l'utilisateur renseigne la ville de départ, la ville d'arrivée et la compagnie puis clique sur le bouton rechercher, le résultat devrait être l'ensembles des voyages qu'effectue cette compagnie mais uniquement pour les villes en question.

    C'est à ce troisième point que j'ai un problème car le résultat attendu n'est pas correcte. il m'affiche plutôt les voyages qu'effectue toutes les compagnies de la base de données pour toutes les villes de la base de données.

    J'ai auparavant fait quelque modification dans ma requête que voici :
    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
    $search = $con->prepare("SELECT tb01.IdCompagnie                AS 'IDComp',
    						       tb01.NomCompagnie                        AS 'Nom Compagnie Départ',
    						       tb02.IdVoyage                            AS 'Numero',
    						       tb09.IdVille                             AS 'ID1',
    						       tb09.NomVille                            AS 'Ville de Départ',
    						       tb05.NomGare                             AS 'Gare de Départ',
    						       tb03.HeureDepart                         AS 'Heure de Départ',
    						       tb10.IdVille                             AS 'ID2',
    						       tb10.NomVille                            AS 'Ville d''Arrivée',
    						       tb06.NomGare                             AS 'Gare d''Arrivée',
    						       tb04.HeureArrivee                        AS 'Heure d''Arrivée',
    						       HOUR(tb04.HeureArrivee-tb03.HeureDepart) AS 'Durée',
    						       tb02.NbrePlaces                          AS 'Nombre de Places',
    						       tb02.Montant                             AS 'Prix du Trajet'
     
    								FROM       compagnie AS tb01
    
    								INNER JOIN voyage           AS tb02
    								ON tb01.IdCompagnie = tb02.IdCompagnie
    								 
    								INNER JOIN depart           AS tb03
    								ON tb03.IdDepart    = tb02.IdDepart
    								 
    								INNER JOIN arrivee          AS tb04
    								ON tb04.IdArrivee   = tb02.IdArrivee
    								 
    								INNER JOIN gare             AS tb05
    								ON tb05.IdGare      = tb03.IdGare
    								 
    								INNER JOIN gare             AS tb06
    								ON tb06.IdGare      = tb04.IdGare
    								 
    								INNER JOIN commune          AS tb07
    								ON tb07.IdCommune   = tb05.IdCommune
    								 
    								INNER JOIN commune          AS tb08
    								ON tb08.IdCommune   = tb06.IdCommune
    								 
    								INNER JOIN ville            AS tb09
    								ON tb09.IdVille     = tb07.IdVille
    								 
    								INNER JOIN ville            AS tb10
    								ON tb10.IdVille     = tb08.IdVille
    								 
    								WHERE (tb01.IdCompagnie = ?) OR (tb09.IdVille= ? AND tb10.IdVille = ?) OR (tb01.IdCompagnie = ? AND tb09.IdVille= ? AND tb10.IdVille = ?)
    								
    								AND NOT EXISTS (SELECT 1
    				                				FROM exception as tb51
    			                    				WHERE tb51.IdVoyage = tb02.IdVoyage
    			                    				AND tb51.NumJour = WEEKDAY(COALESCE(".$date2.",NOW()))
    			                    				)				
    							");

    Je pense qu'il s'agit de la partie de code surligné en rouge. Or cette requête s’exécute bien lorsque je suis en mode SQL sur phpmyadmin.

    Voici le code de vérification des informations renseignées par l'utilisateur :

    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
    <?php 
    	if (isset($_POST["rechercher"])) {
    		$vil_dep = intval($_POST["ville_dep"]);
    		//var_dump($vil_dep);
    		$vil_arriv = intval($_POST["ville_arriv"]);
    		//var_dump($vil_arriv);
    		$comp = intval($_POST["comp"]);
    		//var_dump($comp);
     
    		if(isset($_POST["date"]) AND $_POST["date"]=='Date de départ'){
    			$_POST["date"]=date('d-m-Y');
    			$date=$_POST["date"];
    			//var_dump($date);
    			$date2=date('Y-m-d');
    			//($date2);
    		}
    		elseif (isset($_POST["date"]) AND $_POST["date"]!='Date de départ') {
    			$date=$_POST["date"];
    			$date=date('d-m-Y',strtotime($date));
    			//var_dump($date);
    			$date2=date('Y-m-d',strtotime($date));
    			//$date2=date('Y-m-d');
    			//var_dump($date2);
    		}
    }
    ?>
    Et enfin voici le code de création de ces différents champs à renseigner :

    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
    <div class="row">
    				<div class="col-md-3">
    					<select class="city" id="CityFromId" name="ville_dep" onchange="focusAndSuppressOneCoice(this.value);">
    					<option selected>--Ville Départ--</option>
    					    <?php 
     
    				          $recup_ville = $con->query("SELECT * FROM ville ORDER BY NomVille ASC");
     
    				          while ($donnee = $recup_ville->fetch()) {
     
    				         ?>
     
    						<option value="<?php echo $donnee['IdVille'] ; ?>"><?php echo $donnee['NomVille'] ; ?></option>
     
    						<?php } ?>
    					</select>
     
    				</div>
    				<div class="col-md-3">
    					<select class="city" id="CityToId" name="ville_arriv">
    					<option selected>--Ville Arrivée--</option>
    					    <?php 
     
    				          $recup_ville = $con->query("SELECT * FROM ville ORDER BY NomVille ASC");
     
    				          while ($donne = $recup_ville->fetch()) {
     
    				         ?>
     
    						<option value="<?php echo $donne['IdVille'] ; ?>"><?php echo $donne['NomVille'] ; ?></option>
     
    						<?php } ?>
    					</select>
     
    				</div>
     
    				<div class="col-md-3">
    					<input class="date" id="datepicker" type="text" name="date" value="Date de départ" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Date de départ';}" required=>
    				</div>
    				<div class="col-md-3">
    					<select class="city" name="comp" >
    						<option value="">--Compagnie--</option>
    					    <?php 
     
    				          $recup_comp = $con->query("SELECT * FROM compagnie ORDER BY NomCompagnie ASC");
     
    				          while ($donnees = $recup_comp->fetch()) {
     
    				         ?>
     
    						<option value="<?php echo $donnees['IdCompagnie'] ; ?>"><?php echo $donnees['NomCompagnie'] ; ?></option>
     
    						<?php } ?>
    					</select>
    				</div>
    				<div class="sear">
    					<button class="seabtn" type="submit" name="rechercher">Rechercher</button>
    				</div>
    				<!---start-date-piker---->
    				<link rel="stylesheet" href="../css/jquery-ui.css" />
    				<script src="../js/jquery-ui.js"></script>
    					<script>
    						$(function() {
    						$( "#datepicker" ).datepicker();
    						});
    				</script>
    			<!---/End-date-piker---->
    		</div>

  3. #23
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par findjo Voir le message
    C'est à ce troisième point que j'ai un problème car le résultat attendu n'est pas correcte. il m'affiche plutôt les voyages qu'effectue toutes les compagnies de la base de données pour toutes les villes de la base de données.
    Mais vous semblez avoir laissé les précédents critères avant le code en rouge, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (tb01.IdCompagnie = ?) OR (tb09.IdVille= ? AND tb10.IdVille = ?) OR
    Seul le code en rouge correspond au critère 3/

  4. #24
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut findjo.

    Je ne traite pas ici le formulaire et la façon de récupérer les résultats.
    Pour résoudre votre problème, vous devez construire la requête morceau par morceau en fonction de vos conditions.

    Le résultat de vos sélections proviennent du formulaire et sont contenues dans :
    --> $_POST['depart']
    --> $_POST['arrivee']
    --> $_POST['compagnie']
    Vous avez que deux cas pour chaque variable, soit la variable n'existe pas ou elle est à NULL, soit elle est renseignée

    Maintenant, vous devez construire votre condition, en fonction de ces trois variables.
    La syntaxe complète est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where depart = ? and arrive = ? and compagnie = ?
    Cela se résume à huit cas qu'il faut gérer :
    1) $cond = ""
    2) $cond = "where depart = ?"
    3) $cond = "where arrive = ?"
    4) $cond = "where compagnie = ?"
    5) $cond = "where depart = ? and arrivee = ?"
    6) $cond = "where depart = ? and compagnie = ?"
    7) $cond = "where arrivee = ? and compagnie = ?"
    8) $cond = "where depart = ? and arrivee = ? and compagnie = ?"

    Comme faire ?
    Code php : 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
    <?php
    /*----------------*/
    /* Initialisation */
    /*----------------*/
     
    $cond = NULL;
     
    /*-----------------*/
    /* ville de départ */
    /*-----------------*/
     
    if (isset($_POST['depart']))
    {
         $depart = $_POST['depart'];
     
         if (isset($cond)) $cond .= ' and ';
                           $cond .= 'depart = ?';
    }
    else $depart = NULL;
     
    /*-----------------*/
    /* ville d'arrivée */
    /*-----------------*/
     
    if (isset($_POST['arrivee']))
    {
    	 $arrivee = $_POST['arrivee'];
     
         if (isset($cond)) $cond .= ' and ';
                           $cond .= 'arrivee = ?';
    }
    else $arrivee = NULL;
     
    /*-----------*/
    /* compagnie */
    /*-----------*/
     
    if (isset($_POST['compagnie']))
    {
    	$compagnie = $_POST['compagnie'];
     
        if (isset($cond)) $cond .= ' and ';
                          $cond .= 'compagnie = ?';
    }
    else $compagnie = NULL;
     
    /*--------------*/
    /* Au préalable */
    /*--------------*/
     
    if (isset($cond)) $cond = 'where '.$cond;
     
    /*----------*/
    /* Résultat */
    /*----------*/
     
    echo "condition : ".$cond;
    ?>
    Conclusion : Il faut éviter de mettre une condition dans une requête si cette condition ne sert à rien.
    Par exemple : "chaine like '%' ne sert à rien !
    D'où l'idée est de construire la requête en fonction de l'existence des conditions.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #25
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2013
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 66
    Points : 101
    Points
    101
    Par défaut
    Je voulais éviter que la recherche qui traite la recherche des voyages soit longue mais avec vos conseils j'ai procéder par condition et les résultats retournées sont ceux que je souhaite.

    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. suite au problème de requête sur plusieur table
    Par michelGProuq dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/07/2006, 16h19
  2. [VB6] RecordSet, Oracle, requête sur plusieurs Tables
    Par pier* dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 13/04/2006, 10h19
  3. Requête sur plusieurs tables
    Par sta_schmitt dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/03/2006, 13h54
  4. Requéte sur plusieurs tables
    Par polux23 dans le forum Requêtes
    Réponses: 11
    Dernier message: 23/02/2006, 23h00
  5. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25

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