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. #1
    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 Requêtes sur plusieurs tables
    Bonjour à tous,

    J'ai une base de données dont voici les tables:

    Ville(IdVille,NomVille);
    Commune(IdCommune,NomCommune,#IdVille)
    Gare(IdGare,NomGare,#IdCommune);
    Depart(IdDepart,DateDepart,HeureDepart,#IdGare)
    Arrivee(IdArrivee,DateArrivee,HeureArrivee,#IdGare)
    Voyage(IdVoyage,NbrePlace,Montant,#IdDepart,#IdArrivee)

    Cette base de données consiste à gérer des voyages. Et je souhaite afficher la liste des voyages (Ville de départ, Ville d'arrivée, Gare de départ, Gare d'arrivée, Date de départ, Heure de départ, Date d'arrivée, Heure d'arrivée, Nombre de places)

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 106
    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 106
    Points : 28 393
    Points
    28 393
    Par défaut
    Quelles requêtes as-tu déjà essayées ?
    Quel(s) problème(s) particulier(s) rencontres-tu ?

  3. #3
    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
    Voici la requête que j'ai essayé mais j'ai aucun résulat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM voyage,depart,arrivee,gare,commune 
    where  voyage.IdDepart=depart. IdDepart AND voyage.IdArrivve=arrivee.IdArrivee AND gare. IdGare= depart.IdGare AND arrivee.IdGare 
    AND Gare.IdCommune=Commune.IdCommune AND Ville.IdVille=Commune.IdVille
    Par contre j'ai aussi essayé cette requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT NomVille,NomCommune,NomGare,DateDepart,HeureDepart,DateArrivve,HeureArrivve,NbrePlaces,Montant
    FROM ville D,,commune,gare,depart,arrivee,voyage 
    WHERE ville.IdVille=commune.Idvilles AND commune.IdCommune=gare.IdCommune AND gare.IdGare=depart.IdGare OR gare.IdGare=arrivee.IdGare
    mais je n'arrive pas à retrouver les villes de départ et les villes d'arrivée de même que les gares comme vous pouvez le voir sur la capture d'écran ci-dessous:

    Nom : Capture.PNG
Affichages : 172
Taille : 43,8 Ko

    Comme vous pouvez le voir les villes et les gares sont répétées. Or un voyage n'a pas la même ville de départ et d'arrivée.

  4. #4
    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 462
    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 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut findjo.

    Tu dois faire des jointures entre tes différentes tables.
    Voici un exemple :
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `ville`
    --------------
     
    --------------
    CREATE TABLE `ville`
    (
      `idVille`      integer unsigned NOT NULL auto_increment primary key,
      `nomVille`     varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `ville` (`nomVille`) values
      ('Abidjan'),('Bouaké')
    --------------
     
    --------------
    select * from ville
    --------------
     
    +---------+----------+
    | idVille | nomVille |
    +---------+----------+
    |       1 | Abidjan  |
    |       2 | Bouaké   |
    +---------+----------+
    --------------
    DROP TABLE IF EXISTS `commune`
    --------------
     
    --------------
    CREATE TABLE `commune`
    (
      `idCommune`    integer unsigned NOT NULL auto_increment primary key,
      `nomCommune`   varchar(255)     NOT NULL,
      `idVille`    integer unsigned NOT NULL,
      CONSTRAINT `FK_COMMUNE_VILLE`  FOREIGN KEY (`idVille`)  REFERENCES `ville` (`idVille`)  ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `commune` (`nomCommune`,`idville`) values
      ('Commune d''Abidjan', 1), ('Commune de Bouaké', 2)
    --------------
     
    --------------
    select * from commune
    --------------
     
    +-----------+-------------------+---------+
    | idCommune | nomCommune        | idVille |
    +-----------+-------------------+---------+
    |         1 | Commune d'Abidjan |       1 |
    |         2 | Commune de Bouaké |       2 |
    +-----------+-------------------+---------+
    --------------
    DROP TABLE IF EXISTS `gare`
    --------------
     
    --------------
    CREATE TABLE `gare`
    (
      `idGare`       integer unsigned NOT NULL auto_increment primary key,
      `nomGare`      varchar(255)     NOT NULL,
      `idCommune`    integer unsigned NOT NULL,
      CONSTRAINT `FK_GARE_COMMUNE`  FOREIGN KEY (`idCommune`)  REFERENCES `commune` (`idCommune`)  ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `gare` (`nomGare`,`idCommune`) values
      ('Gare d''Abidjan', 1), ('Gare de Bouaké', 2)
    --------------
     
    --------------
    select * from gare
    --------------
     
    +--------+----------------+-----------+
    | idGare | nomGare        | idCommune |
    +--------+----------------+-----------+
    |      1 | Gare d'Abidjan |         1 |
    |      2 | Gare de Bouaké |         2 |
    +--------+----------------+-----------+
    --------------
    DROP TABLE IF EXISTS `depart`
    --------------
     
    --------------
    CREATE TABLE `depart`
    (
      `idDepart`     integer unsigned NOT NULL auto_increment primary key,
      `dateDepart`   date             NOT NULL,
      `heureDepart`  time             NOT NULL,
      `idGare`       integer unsigned NOT NULL,
      CONSTRAINT `FK_DEPART_GARE`  FOREIGN KEY (`idGare`)  REFERENCES `gare` (`idGare`)  ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `depart` (`dateDepart`,`heureDepart`,`idGare`) values
      ('2016-05-13', '15:00:10', 1)
    --------------
     
    --------------
    select * from depart
    --------------
     
    +----------+------------+-------------+--------+
    | idDepart | dateDepart | heureDepart | idGare |
    +----------+------------+-------------+--------+
    |        1 | 2016-05-13 | 15:00:10    |      1 |
    +----------+------------+-------------+--------+
    --------------
    DROP TABLE IF EXISTS `arrivee`
    --------------
     
    --------------
    CREATE TABLE `arrivee`
    (
      `idArrivee`     integer unsigned NOT NULL auto_increment primary key,
      `dateArrivee`   date             NOT NULL,
      `heureArrivee`  time             NOT NULL,
      `idGare`        integer unsigned NOT NULL,
      CONSTRAINT `FK_ARRIVEE_GARE`  FOREIGN KEY (`idGare`)  REFERENCES `gare` (`idGare`)  ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `arrivee` (`dateArrivee`,`heureArrivee`,`idGare`) values
      ('2016-05-13', '19:00:10', 2)
    --------------
     
    --------------
    select * from arrivee
    --------------
     
    +-----------+-------------+--------------+--------+
    | idArrivee | dateArrivee | heureArrivee | idGare |
    +-----------+-------------+--------------+--------+
    |         1 | 2016-05-13  | 19:00:10     |      2 |
    +-----------+-------------+--------------+--------+
    --------------
    DROP TABLE IF EXISTS `voyage`
    --------------
     
    --------------
    CREATE TABLE `voyage`
    (
      `idVoyage`    integer unsigned NOT NULL auto_increment primary key,
      `nbrePlace`   integer unsigned NOT NULL,
      `montant`     decimal(15,2)    NOT NULL,
      `idDepart`    integer unsigned NOT NULL,
      `idArrivee`   integer unsigned NOT NULL,
      CONSTRAINT `FK_DEPART`  FOREIGN KEY (`idDepart`)  REFERENCES `depart`  (`idDepart`)  ON DELETE RESTRICT ON UPDATE CASCADE,
      CONSTRAINT `FK_ARRIVEE` FOREIGN KEY (`idArrivee`) REFERENCES `arrivee` (`idArrivee`) ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `voyage` (`nbrePlace`,`montant`,`idDepart`,`idArrivee`) values
      (5, 127.25, 1, 1)
    --------------
     
    --------------
    select * from voyage
    --------------
     
    +----------+-----------+---------+----------+-----------+
    | idVoyage | nbrePlace | montant | idDepart | idArrivee |
    +----------+-----------+---------+----------+-----------+
    |        1 |         5 |  127.25 |        1 |         1 |
    +----------+-----------+---------+----------+-----------+
    --------------
    select tb8.nomVille      as 'Ville de Départ',
           tb9.nomVille      as 'Ville d''Arrivée',
           tb4.nomGare       as 'Gare de Départ',
           tb5.nomGare       as 'Gare d''Arrivée',
           tb2.dateDepart    as 'Date de Départ',
           tb2.HeureDepart   as 'Heure de Départ',
           tb3.dateArrivee   as 'Date d''Arrivée',
           tb3.heureArrivee  as 'Heure d''Arrivée',
           tb1.nbrePlace     as 'Nombre de Places',
           tb1.montant       as 'Prix du Trajet'
     
    from       voyage  as tb1
     
    inner join depart  as tb2
    on tb2.idDepart  = tb1.idDepart
     
    inner join arrivee as tb3
    on tb3.idArrivee = tb1.idArrivee
     
    inner join gare    as tb4
    on tb4.idGare    = tb2.idGare
     
    inner join gare    as tb5
    on tb5.idGare    = tb3.idGare
     
    inner join commune as tb6
    on tb6.idCommune = tb4.idCommune
     
    inner join commune as tb7
    on tb7.idCommune = tb5.idCommune
     
    inner join ville   as tb8
    on tb8.idVille   = tb6.idVille
     
    inner join ville   as tb9
    on tb9.idVille   = tb7.idVille
    --------------
     
    +-----------------+-----------------+----------------+----------------+----------------+-----------------+----------------+-----------------+------------------+----------------+
    | Ville de Départ | Ville d'Arrivée | Gare de Départ | Gare d'Arrivée | Date de Départ | Heure de Départ | Date d'Arrivée | Heure d'Arrivée | Nombre de Places | Prix du Trajet |
    +-----------------+-----------------+----------------+----------------+----------------+-----------------+----------------+-----------------+------------------+----------------+
    | Abidjan         | Bouaké          | Gare d'Abidjan | Gare de Bouaké | 2016-05-13     | 15:00:10        | 2016-05-13     | 19:00:10        |                5 |         127.25 |
    +-----------------+-----------------+----------------+----------------+----------------+-----------------+----------------+-----------------+------------------+----------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

  5. #5
    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
    Merci beaucoup Artemus24

  6. #6
    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 Suite de la requête sur plusieurs tables
    Bonjour à tous,

    Mes tables ont changé un peu de configuration et voici la nouvelle:

    Compagnie (IdCompagnie,NomCompagnie)
    Ville(IdVille,NomVille);
    Commune(IdCommune,NomCommune,#IdVille);
    Gare(IdGare,NomGare,#IdCommune,#IdCompagnie);
    Depart(IdDepart,HeureDepart,#IdGare);
    Arrivee(IdArrivee,HeureArrivee,#IdGare);
    Voyage(IdVoyage,NbrePlace,Montant,#IdDepart,#IdArrivee);

    Avec en plus les deux nouvelles tables que voici:

    Exception (IdException);
    Voyage_Exception(IdVoyage_Exception,#IdVoyage,#IdException)

    La table Exception recense les différents jours de la semaine en format nombres entiers (1,2,3,4,5,6,7)

    Dans un premier temps je souhaitais avoir la liste des voyages comme celui affiché dans le tableau d'un des messages ci-haut. J'ai donc faire cette requête qui marche à merveille:

    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
    SELECT  tb0.IdCompagnie AS 'IDComp', tb0.NomCompagnie AS 'Compagnie', tb1.IdVoyage AS 'Numero', tb8.IdVille AS 'ID1', tb8.NomVille AS 'Ville de Départ', tb4.NomGare AS 'Gare de Départ',tb2.HeureDepart AS 'Heure de Départ',  tb9.IdVille AS 'ID2', tb9.NomVille AS 'Ville d''Arrivée'  , tb5.NomGare AS 'Gare d''Arrivée' , tb3.HeureArrivee AS 'Heure d''Arrivée', HOUR(tb3.HeureArrivee-tb2.HeureDepart) AS 'Durée', tb1.NbrePlaces as 'Nombre de Places', tb1.Montant AS 'Prix du Trajet'
     FROM    voyage  AS tb1
    INNER JOIN depart  AS tb2
    		ON tb2.idDepart  = tb1.idDepart				 
    		INNER JOIN arrivee as tb3
    		ON tb3.idArrivee = tb1.idArrivee
                    INNER JOIN gare    as tb4
    		ON tb4.idGare    = tb2.idGare						 
    		INNER JOIN gare    as tb5
    		ON tb5.idGare    = tb3.idGare
                    INNER JOIN compagnie as tb0
                   ON tb0.IdCompagnie=tb4.IdCompagnie
                   INNER JOIN commune as tb6
    	       ON tb6.idCommune = tb4.idCommune
                    INNER JOIN commune as tb7
    		ON tb7.idCommune = tb5.idCommune
                    INNER JOIN ville   as tb8
                    ON tb8.idVille   = tb6.idVille
                    INNER JOIN ville   as tb9
                    ON tb9.idVille   = tb7.idVille
                  WHERE tb0.IdCompagnie=1
    Nom : NoError.PNG
Affichages : 205
Taille : 78,5 Ko

    Maintenant je souhaite faire une requête qui me liste les voyages dont l'identifiant de la compagnie est 1 et dont un jour saisie par l'utilisateur n'appartient pas aux exceptions. Voici la requête que j'ai faite:

    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
    SELECT  tb0.IdCompagnie AS 'IDComp', tb0.NomCompagnie AS 'Compagnie', tb1.IdVoyage AS 'Numero', tb8.IdVille AS 'ID1', tb8.NomVille AS 'Ville de Départ', tb4.NomGare AS 'Gare de Départ',tb2.HeureDepart AS 'Heure de Départ',  tb9.IdVille AS 'ID2', tb9.NomVille AS 'Ville d''Arrivée'  , tb5.NomGare AS 'Gare d''Arrivée' , tb3.HeureArrivee AS 'Heure d''Arrivée', HOUR(tb3.HeureArrivee-tb2.HeureDepart) AS 'Durée', tb1.NbrePlaces as 'Nombre de Places', tb1.Montant AS 'Prix du Trajet'
     FROM    voyage  AS tb1
    INNER JOIN depart  AS tb2
    		ON tb2.idDepart  = tb1.idDepart				 
    		INNER JOIN arrivee as tb3
    		ON tb3.idArrivee = tb1.idArrivee
                    INNER JOIN gare    as tb4
    		ON tb4.idGare    = tb2.idGare						 
    		INNER JOIN gare    as tb5
    		ON tb5.idGare    = tb3.idGare
                    INNER JOIN compagnie as tb0
                   ON tb0.IdCompagnie=tb4.IdCompagnie
                   INNER JOIN commune as tb6
    	       ON tb6.idCommune = tb4.idCommune
                    INNER JOIN commune as tb7
    		ON tb7.idCommune = tb5.idCommune
                    INNER JOIN ville   as tb8
                    ON tb8.idVille   = tb6.idVille
                    INNER JOIN ville   as tb9
                    ON tb9.idVille   = tb7.idVille
     WHERE IDComp=1 AND 
               2 NOT IN (SELECT tb3.IdException
                                FROM voyage AS tb1
                                   INNER JOIN voyage_exception AS tb3
                                    ON tb1.IdVoyage=tb3.IdVoyage)
    NB: Le 2 de la clause est le numéro du jour saisie par l'utilisateur. Ce numéro sera obtenu avec la fonction DAYOFWEEK(DateSaisie)

    Mais j'obtiens une erreur me disant que la syntaxe n'est pas correcte:

    Nom : Error2.PNG
Affichages : 165
Taille : 30,9 Ko

    Quelle serait la bonne requête pour régler mon problème SVP?

  7. #7
    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 462
    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 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut findjo.

    C'est ta table "Exception" qui me pose des problèmes de compréhension, ainsi que la table "Voyage_Exception" !
    Vu comme elles sont construites, elles ne te servent à rien.

    L'identifiant "idVoyage" détermine un voyage caractérisé par son heure de départ et son heure d'arrivée mais pour n'importe quelle jour.
    C'est ce "n'importe quel jour" qui me pose des problèmes. Je te propose la structure suivante :

    Exception (#idVoyage, numJjour)

    Ce "numJour" correspond au numéro du jour dans la semaine, valeur donnée par la fonction "dayofweek".

    Pour un identifiant voyage donnée, tu auras la liste des jours de la semaine où ce train ne circule pas.
    Cela va très bien car je suppose que les exceptions, il n'y en a pas autant que les jours où ce train circule dans la semaine.

    De plus, ce couple (#idVoyage ; numJour), qui est aussi ta clef primaire, sera unique dans ta table.
    Et ce "idVoyage" est aussi une clef étrangère !!!

    Voici sa structure, au cas où tu aurais des difficultés à comprendre mon exposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE `exception`
    ( `idVoyage` integer unsigned NOT NULL,
      `numJour`  tinyint unsigned NOT NULL,
      CONSTRAINT `FK_EXCEPTION_VOYAGE` FOREIGN KEY (`idVoyage`) REFERENCES `voyage` (`idVoyage`) ON DELETE RESTRICT ON UPDATE DESTRICT;
      primary key (`idVoyage`,`numJour`)
    )	ENGINE=InnoDB
    	DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
    	ROW_FORMAT=COMPRESSED;
    Du coup, cela va simplifier le traitement de tes exceptions :
    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
    SELECT tb06.IdCompagnie                         AS 'IDComp Départ',
           tb06.NomCompagnie                        AS 'Nom Compagnie Départ',
           tb01.IdVoyage                            AS 'Numero',
           tb10.IdVille                             AS 'ID1',
           tb10.NomVille                            AS 'Ville de Départ',
           tb04.NomGare                             AS 'Gare de Départ',
           tb02.HeureDepart                         AS 'Heure de Départ',
           tb11.IdVille                             AS 'ID2',
           tb11.NomVille                            AS 'Ville d''Arrivée',
           tb05.NomGare                             AS 'Gare d''Arrivée',
           tb03.HeureArrivee                        AS 'Heure d''Arrivée',
           HOUR(tb03.HeureArrivee-tb02.HeureDepart) AS 'Durée',
           tb01.NbrePlaces                          AS 'Nombre de Places',
           tb01.Montant                             AS 'Prix du Trajet'
     
    FROM       voyage           AS tb01
     
    INNER JOIN depart           AS tb02
    ON tb02.idDepart    = tb01.idDepart
     
    INNER JOIN arrivee          AS tb03
    ON tb03.idArrivee   = tb01.idArrivee
     
    INNER JOIN gare             AS tb04
    ON tb04.idGare      = tb02.idGare
     
    INNER JOIN gare             AS tb05
    ON tb05.idGare      = tb03.idGare
     
    INNER JOIN compagnie        AS tb06
    ON tb06.IdCompagnie = tb04.IdCompagnie
     
    INNER JOIN compagnie        AS tb07
    ON tb07.IdCompagnie = tb05.IdCompagnie
     
    INNER JOIN commune          AS tb08
    ON tb08.idCommune   = tb04.idCommune
     
    INNER JOIN commune          AS tb09
    ON tb09.idCommune   = tb05.idCommune
     
    INNER JOIN ville            AS tb10
    ON tb10.idVille     = tb08.idVille
     
    INNER JOIN ville            AS tb11
    ON tb11.idVille     = tb09.idVille
     
    WHERE tb06.IDCompagnie = 1
      AND NOT EXISTS (SELECT 1
                      FROM exception as tb51
                      where tb51.idVoyage = tb01.idVoyage
                        and tb51.numJour  = dayofweek( {la date que tu veux tester et qui vient de la saisie} )
                     )
    ;
    Je n'ai pas testé, mais je pense que c'est correcte !

    J'ai ajouté la compagnie sur la gare d'arrivée.
    D'ailleurs, cette compagnie n'est pas correctement structurée dans ta base de données.
    Je l'aurai associé à la table "voyage" plutôt qu'à la table "gare".

    @+

  8. #8
    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
    Ok Merci Artemus24

  9. #9
    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
    Bonjour Artemus24

    Concernant la conception de ta table exception, je ne comprends pas bien quelque chose.
    Supposons que le voyage 1 n'a pas lieu le lundi, la table exception sera la suivante:
    exception(1,1)
    Maintenant si le voyage 2 n'a pas aussi lieu le lundi, la table exception sera la suivante:
    exception,2,1

    N'est ce pas?

  10. #10
    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 462
    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 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut findjo.

    Si le '1' correspond au lundi, oui, c'est cela !

    @+

  11. #11
    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
    Mais est t'il bon qu'à chaque fois qu'un voyage a pour exception lundi, on ajoute le même 1 à chaque fois?

    Ensuite je ne sais pas d'où viens le 1(souligné) du select de la sous-requêtes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    AND NOT EXISTS (SELECT 1
                      FROM exception as tb51
                      where tb51.idVoyage = tb01.idVoyage
                        and tb51.numJour  = dayofweek( {la date que tu veux tester et qui vient de la saisie} )
                     )
    ;

  12. #12
    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 462
    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 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut Findjo.

    Citation Envoyé par findjo
    Mais est-il bon qu'à chaque fois qu'un voyage a pour exception lundi, on ajoute le même 1 ?
    Prenons deux cas de figures :
    1) soit le voyage '1' où ce train ne circule pas le lundi mais circule les autres jours.
    2) soit le voyage '2' où ce train ne circule pas le mercredi mais circule les autres jours.

    Comment vas-tu renseigner ta table exception pour gérer cela ?
    Et bien, pour le voyage = 1, tu vas mettre 1 (lundi).
    Tandis que pour le voyage = 2, tu vas mettre 3 (mercredi).

    Ce qui va faire que tu vas devoir gérer pour chaque voyage les exceptions. Je sais, cela va vite devenir ingérable.

    Citation Envoyé par findjo
    Ensuite je ne sais pas d'où viens le 1(souligné) du select de la sous-requêtes:
    Ici, la requête fourni deux résultats possibles :
    --> soit tu trouves l'exception et dans ce cas, le select te retourne 1. Le where not exists ne va pas traiter la ligne.
    --> soit tu ne trouves aucune exception et dans ce cas, le select retourne null. Le where not exists va traiter la ligne.

    Si le '1' ne te plait pas, tu peux mettre à la place '*'.

    @+

  13. #13
    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
    Ok merci

  14. #14
    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
    Citation Envoyé par Artemus24 Voir le message
    Salut Findjo.


    Prenons deux cas de figures : […]

    @+
    Concernant la gestion des exceptions j'ai créé les tables suivantes :

    exception(IdException)
    voyage(IdVoyage,#IdDepart,#IdArrivee,#IdCompagnie,Montant,NbrePlace)
    voyage_exception(IdVoyage_Exception,#IdException,#IdVoyage).

    Ainsi une exception peut concerner 0 ou plusieurs voyages et un voyage peut être concerné par une ou plusieurs exceptions, d'où la table voyage_exception.

    Comme IdException je peux avoir les valeurs suivantes: 1(lundi), 2(Mardi), 3(Mercredi), 4(Jeudi), 5(Vendredi), 6(Samedi), 7(Dimanche)

    Est-ce que vous pensez que je peux adopter cette démarche pour éviter les redondances de données ?

  15. #15
    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 462
    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 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut findjo.

    Je vais reprendre quelques points pour gérer correctement ces exceptions.

    1) la signification des exceptions. Il y a deux façons de voir le problème :
    --> Soit tout est autorisé sauf.
    --> Soit tout est interdit sauf.

    Je pense que tu as fait le choix de la première solution. Il ne faut pas s'arrêter à ce qui est évident au premier abord.
    Je tiens à montrer que la saisie peut-être minimaliste et ne doit pas être négligée.
    Par exemple, un train circule seulement le mardi.
    En choisissant la première solution, tu dois entrer six exceptions : 1, 3, 4, 5, 6, 7.
    Tandis qu'avec la seconde solution, tu saisies qu'une seule exception : 2.

    2) Une exception, c'est juste le jour sous la forme d'un chiffre. Tu indiques ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Comme IdException je peux avoir les valeurs suivantes: 1(lundi), 2(Mardi), 3(Mercredi), 4(Jeudi), 5(Vendredi), 6(Samedi), 7(Dimanche)
    Et dans le post #6, tu dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La table Exception recense les différents jours de la semaine en format nombres entiers (1,2,3,4,5,6,7)
    .
    En fait, tu définies une règle de gestion (ou une convention si tu préfères) et elle ne va pas changer durant ton projet.
    Il est inutile de créer une table exception définissant la signification de ce chiffre.
    De même, la table d'association (exception ; voyage) n'a plus de raison d'être.

    Le mieux est de définir une seule table donnant la liste des exceptions pour un voyage donné.
    Je ne dis pas que ta solution est mauvaise, mais elle a tendance à alourdir ton modèle sans apporter un quelconque avantage.

    Voici ce que je propose : "Exception(IdException,#IdVoyage,Code_Exception)".
    IdException est la clef primaire qui est un auto_increment.
    #IdVoyage est une clef étrangère sur la table Voyage.
    Code_exception est le chiffre (celui de la convention) qui va définir ce que j'indique dans mon paragraphe 1) ci-dessus.

    L'accès à cette table se fera par l'identifiant du voyage (IdVoyage).

    Citation Envoyé par findjo
    Est-ce que vous pensez que je peux adopter cette démarche pour éviter les redondances de données?
    La redondance est inévitable ! Tu es obligé d'indiquer la liste des exceptions pour chaque voyage.
    Dans mon paragraphe 1), j'estime que les deux approches ne sont pas équivalentes, et que tu peux trouver par toi-même celle qui sera minimaliste.

    Mais on peut aussi se poser la question de l'intérêt de mettre cela sous la forme d'une table des exceptions.
    Qu'est-ce qui t'empêche de créer une colonne exception dans la table des voyages ?
    Cette colonne sera de type char(07). Ce sera un petit tableau où chaque caractère représente un élément de ton tableau allant de 1 à 7.
    Par Convention, 1 sera le lundi, 2 le mardi, ... et 7 le dimanche. Tu mets une croix pour dire que le train ne circule pas, pour un jour donné.
    C'est juste une information brute qui se présente ainsi : "X.X...." avec comme signification que le train ne circule pas le lundi et le mercredi.
    A l'affichage, tu devras gérer ce tableau afin de rendre ces informations plus lisible et plus exploitation.
    Rien d'insurmontable à faire en php.

    @+

  16. #16
    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
    Salut Artemus24.

    1)Je préfère adopter ta première proposition qui est celle de créer une seule table Exception dont la structure est la suivante :

    exception(IdException,#IdVoyage,NumJour).

    Mais la requête n'affiche aucun résultat or il ya bien des voyages dans ma base de données. Voici la requête modifié:

    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
    SELECT tb01.IdCompagnie AS 'IDComp Départ',
               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 (tb09.IdVille= ? AND tb10.IdVille = ? AND tb01.IdCompagnie = ?)
    AND NOT EXISTS (SELECT 1 
                              FROM exception as tb51
                              WHERE tb51.IdVoyage = tb01.IdVoyage
                              AND tb51.NumJour = dayofweek('$date2')

    Je pense que le problème se trouve au niveau de la sous-requête car j'efface la sous requête, les informations s'affiche bel et bien lorsque je lance la recherche.


    2) En ce qui concerne ta deuxième proposition qui est celle que créer une colonne dans la table voyage, je vais la tester plus tard vu l'urgence du projet.

  17. #17
    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 462
    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 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut findjo.

    Désolé, ce n'est pas la bonne fonction.
    Si tu choisis la fonction "dayofweek()", la convention est la suivante : 1 pour dimanche, 2 pour lundi, ..., 7 pour samedi.
    --> https://dev.mysql.com/doc/refman/5.7...tion_dayofweek

    Tandis qu'avec la fonction "weekday()", la convention est la suivante : 0 pour lundi, 1 pour mardi, ..., 6 pour dimanche.
    --> https://dev.mysql.com/doc/refman/5.7...nction_weekday

    Voici un exemple d'utilisation de la fonction "weekday()" sur la semaine actuelle :
    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
    --------------
    select '2016-06-20' as 'date', weekday('2016-06-20') as 'numéro' union
    select '2016-06-21' as 'date', weekday('2016-06-21') as 'numéro' union
    select '2016-06-22' as 'date', weekday('2016-06-22') as 'numéro' union
    select '2016-06-23' as 'date', weekday('2016-06-23') as 'numéro' union
    select '2016-06-24' as 'date', weekday('2016-06-24') as 'numéro' union
    select '2016-06-25' as 'date', weekday('2016-06-25') as 'numéro' union
    select '2016-06-26' as 'date', weekday('2016-06-26') as 'numéro' union
    select '2016-06-27' as 'date', weekday('2016-06-27') as 'numéro'
    --------------
     
    +------------+--------+
    | date       | numéro |
    +------------+--------+
    | 2016-06-20 |      0 |
    | 2016-06-21 |      1 |
    | 2016-06-22 |      2 |
    | 2016-06-23 |      3 |
    | 2016-06-24 |      4 |
    | 2016-06-25 |      5 |
    | 2016-06-26 |      6 |
    | 2016-06-27 |      0 |
    +------------+--------+
     
    Appuyez sur une touche pour continuer...
    Le 20 juin 2016 comme le 27 juin 2016 sont bien des lundis.

    Afin de faire coïncider avec ta convention : 1 pour lundi, 2 pour mardi, ..., 7 pour dimanche, tu dois ajouter +1 au résultat de ta fonction.

    La structure du test de l'existence de l'exception ne change pas. Sauf que tu dois remplacer l'ancienne fonction par la nouvelle, que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND NOT EXISTS (SELECT 1 
                    FROM exception as tb51
                    WHERE tb51.IdVoyage = tb01.IdVoyage
                      AND tb51.NumJour  = weekday('$date2') + 1
    @+

  18. #18
    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
    1)J'ai trouvé l'anomalie dans la sous-requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AND NOT EXISTS (SELECT 1 
                    FROM exception as tb51
                    WHERE tb51.IdVoyage = tb01.IdVoyage
                      AND tb51.NumJour  = weekday('$date2') + 1
    Il faut plutôt ecrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AND NOT EXISTS (SELECT 1
                             FROM exception as tb51, voyage as tb01
    			 WHERE tb51.IdVoyage = tb01.IdVoyage
    			 AND tb51.NumJour = weekday('$date2')
    			)
    Le problème ce trouvait au niveau de la table voyage qui doit se trouvée également dans la clause FROM de la sous-requête.Or moi je pensais avant que comme la table voyage est déjà indiquée dans la requête principale je n'avait plus besoin d'elle dans la sous-requête ; ce qui n'est pas le cas.



    2)Maintenant le problème que je rencontre est le suivant :

    Dans le système il se peut que l'utilisateur ne renseigne pas le champ contenant la date. Dans ce cas je donne à la variable $date2 la date du jour comme vous pouvez le constater avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (empty($_POST["date"])) {
    			$date2=date("Y-m-d");
    		}
    		else{
    			$date1 = $_POST["date"];
    			$date = date_create($date1);
    			$date2 = date_format($date,'Y-m-d');
    			$date = date_format($date,'d/m/Y');
    		}
    Et lorsque je lance la recherche sans renseigner la date, l'erreur suivante apparaît :

    Nom : error.PNG
Affichages : 135
Taille : 22,6 Ko

    Apparemment, il s'agit d'une erreur concernant la fonction date_format où le paramètre de la fonction doit être au format datetime.

    Je remplace donc par le code suivant mais toujours l'erreur s'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (empty($_POST["date"])) {
    			$date2=date("Y-m-d");
    		}
    		else{
    			$date1 = $_POST["date"];
    			$date = date_create($date1);
    			$date2 = date_format($date,'Y-m-d H:i:s');
    			$date = date_format($date,'d/m/Y H:i:s');
    		}
    Comment dois-je procéder SVP ?

  19. #19
    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 462
    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 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut Findjo.

    Il n'y a pas d'anomalie dans la sous-requête.
    Si dans la requête principale, la table "voyage" est préfixé par "tb25", il faut mettre "WHERE tb51.IdVoyage = tb25.IdVoyage.

    Citation Envoyé par Findjo
    Or moi je pensais avant que comme la table voyage est déjà indiquée dans la requête principale je n'avait plus besoin d'elle dans la sous-requête ;
    Mais vous aviez raison !

    Il se peut que vous vous êtes trompé de préfixe dans votre sous-requête.
    J'avais, dans mon test, associé la table "voyage" au préfixe "tb01".
    Or d'après votre requête, la table "voyage" est préfixé par "tb02" !

    En ce qui concerne la date non renseignée, il suffit de mettre "null" pour résoudre le problème. Oui, mais comment ?

    Vous devez utiliser la fonction "coalesce()" qui va tester si le premier paramètre est null ou pas.
    Si c'est null, alors il prend le second paramètre, sinon il prend le premier paramètre.

    --> http://dev.mysql.com/doc/refman/5.7/...ction_coalesce

    Dans l'exemple ci-après, la première requête donne deux lignes sans traiter la table "exception". C'est, disons le cas général.

    Dans la deuxième requête, la date est à NULL. Je prends donc la date du jour "now()".
    Et comme nous sommes aujourd'hui (mercredi) , je teste la table "exception" qui possède une interdiction de circuler pour IdVoyage = 1 le mercredi (3).

    Dans la troisième requête, qui est identique à la deuxième sauf que cette fois-ci, la date est renseignée à hier (le '2016-06-21').
    Et donc, il n'y a pas d'exception, et nous avons nos deux lignes.

    J'espère que cela va répondre à votre attente !

    Et voici l'exemple :
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `compagnie`
    --------------
     
    --------------
    CREATE TABLE `compagnie`
    (
      `idCompagnie`   integer unsigned NOT NULL auto_increment primary key,
      `nomCompagnie`  varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `compagnie` (`nomCompagnie`) values
      ('utb')
    --------------
     
    --------------
    select * from compagnie
    --------------
     
    +-------------+--------------+
    | idCompagnie | nomCompagnie |
    +-------------+--------------+
    |           1 | utb          |
    +-------------+--------------+
    --------------
    DROP TABLE IF EXISTS `ville`
    --------------
     
    --------------
    CREATE TABLE `ville`
    (
      `idVille`      integer unsigned NOT NULL auto_increment primary key,
      `nomVille`     varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `ville` (`nomVille`) values
      ('Abidjan'),('Bouaké')
    --------------
     
    --------------
    select * from ville
    --------------
     
    +---------+----------+
    | idVille | nomVille |
    +---------+----------+
    |       1 | Abidjan  |
    |       2 | Bouaké   |
    +---------+----------+
    --------------
    DROP TABLE IF EXISTS `commune`
    --------------
     
    --------------
    CREATE TABLE `commune`
    (
      `idCommune`    integer unsigned NOT NULL auto_increment primary key,
      `nomCommune`   varchar(255)     NOT NULL,
      `idVille`      integer unsigned NOT NULL,
      CONSTRAINT `FK_COMMUNE_VILLE`  FOREIGN KEY (`idVille`)  REFERENCES `ville` (`idVille`)  ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `commune` (`nomCommune`,`idville`) values
      ('Commune d''Abidjan', 1), ('Commune de Bouaké', 2)
    --------------
     
    --------------
    select * from commune
    --------------
     
    +-----------+-------------------+---------+
    | idCommune | nomCommune        | idVille |
    +-----------+-------------------+---------+
    |         1 | Commune d'Abidjan |       1 |
    |         2 | Commune de Bouaké |       2 |
    +-----------+-------------------+---------+
    --------------
    DROP TABLE IF EXISTS `gare`
    --------------
     
    --------------
    CREATE TABLE `gare`
    (
      `idGare`       integer unsigned NOT NULL auto_increment primary key,
      `nomGare`      varchar(255)     NOT NULL,
      `idCommune`    integer unsigned NOT NULL,
      `idCompagnie`  integer unsigned NOT NULL,
      CONSTRAINT `FK_GARE_COMMUNE`    FOREIGN KEY (`idCommune`)    REFERENCES `commune`   (`idCommune`)    ON DELETE RESTRICT ON UPDATE CASCADE,
      CONSTRAINT `FK_GARE_COMPAGNIE`  FOREIGN KEY (`idCompagnie`)  REFERENCES `compagnie` (`idCompagnie`)  ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `gare` (`nomGare`,`idCommune`,`idCompagnie`) values
      ('Gare d''Abidjan', 1, 1), ('Gare de Bouaké', 2, 1)
    --------------
     
    --------------
    select * from gare
    --------------
     
    +--------+----------------+-----------+-------------+
    | idGare | nomGare        | idCommune | idCompagnie |
    +--------+----------------+-----------+-------------+
    |      1 | Gare d'Abidjan |         1 |           1 |
    |      2 | Gare de Bouaké |         2 |           1 |
    +--------+----------------+-----------+-------------+
    --------------
    DROP TABLE IF EXISTS `depart`
    --------------
     
    --------------
    CREATE TABLE `depart`
    (
      `idDepart`     integer unsigned NOT NULL auto_increment primary key,
      `dateDepart`   date             NOT NULL,
      `heureDepart`  time             NOT NULL,
      `idGare`       integer unsigned NOT NULL,
      CONSTRAINT `FK_DEPART_GARE`  FOREIGN KEY (`idGare`)  REFERENCES `gare` (`idGare`)  ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `depart` (`dateDepart`,`heureDepart`,`idGare`) values
      ('2016-05-13', '15:00:00', 1),
      ('2016-05-13', '08:30:00', 2)
    --------------
     
    --------------
    select * from depart
    --------------
     
    +----------+------------+-------------+--------+
    | idDepart | dateDepart | heureDepart | idGare |
    +----------+------------+-------------+--------+
    |        1 | 2016-05-13 | 15:00:00    |      1 |
    |        2 | 2016-05-13 | 08:30:00    |      2 |
    +----------+------------+-------------+--------+
    --------------
    DROP TABLE IF EXISTS `arrivee`
    --------------
     
    --------------
    CREATE TABLE `arrivee`
    (
      `idArrivee`     integer unsigned NOT NULL auto_increment primary key,
      `dateArrivee`   date             NOT NULL,
      `heureArrivee`  time             NOT NULL,
      `idGare`        integer unsigned NOT NULL,
      CONSTRAINT `FK_ARRIVEE_GARE`  FOREIGN KEY (`idGare`)  REFERENCES `gare` (`idGare`)  ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `arrivee` (`dateArrivee`,`heureArrivee`,`idGare`) values
      ('2016-05-13', '19:00:00', 2),
      ('2016-05-13', '12:00:00', 1)
    --------------
     
    --------------
    select * from arrivee
    --------------
     
    +-----------+-------------+--------------+--------+
    | idArrivee | dateArrivee | heureArrivee | idGare |
    +-----------+-------------+--------------+--------+
    |         1 | 2016-05-13  | 19:00:00     |      2 |
    |         2 | 2016-05-13  | 12:00:00     |      1 |
    +-----------+-------------+--------------+--------+
    --------------
    DROP TABLE IF EXISTS `voyage`
    --------------
     
    --------------
    CREATE TABLE `voyage`
    (
      `idVoyage`    integer unsigned NOT NULL auto_increment primary key,
      `nbrePlace`   integer unsigned NOT NULL,
      `montant`     decimal(15,2)    NOT NULL,
      `idDepart`    integer unsigned NOT NULL,
      `idArrivee`   integer unsigned NOT NULL,
      CONSTRAINT `FK_VOYAGE_DEPART`  FOREIGN KEY (`idDepart`)  REFERENCES `depart`  (`idDepart`)  ON DELETE RESTRICT ON UPDATE CASCADE,
      CONSTRAINT `FK_VOYAGE_ARRIVEE` FOREIGN KEY (`idArrivee`) REFERENCES `arrivee` (`idArrivee`) ON DELETE RESTRICT ON UPDATE CASCADE
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `voyage` (`nbrePlace`,`montant`,`idDepart`,`idArrivee`) values
      ( 5, 127.25, 1, 1),
      (17,  75.00, 2, 2)
    --------------
     
    --------------
    select * from voyage
    --------------
     
    +----------+-----------+---------+----------+-----------+
    | idVoyage | nbrePlace | montant | idDepart | idArrivee |
    +----------+-----------+---------+----------+-----------+
    |        1 |         5 |  127.25 |        1 |         1 |
    |        2 |        17 |   75.00 |        2 |         2 |
    +----------+-----------+---------+----------+-----------+
    --------------
    DROP TABLE IF EXISTS `exception`
    --------------
     
    --------------
    CREATE TABLE `exception`
    ( `idException`  integer unsigned not null auto_increment primary key,
      `idVoyage`     integer unsigned NOT NULL,
      `numJour`      tinyint unsigned NOT NULL,
      CONSTRAINT `FK_EXCEPTION_VOYAGE` FOREIGN KEY (`idVoyage`) REFERENCES `voyage` (`idVoyage`) ON DELETE RESTRICT ON UPDATE RESTRICT,
      index `idx` (`idVoyage`,`numJour`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `exception` (`idVoyage`,`numJour`) values (1, 3)
    --------------
     
    --------------
    select * from exception
    --------------
     
    +-------------+----------+---------+
    | idException | idVoyage | numJour |
    +-------------+----------+---------+
    |           1 |        1 |       3 |
    +-------------+----------+---------+
    --------------
    SELECT tb06.IdCompagnie                              AS 'IDComp Départ',
           tb06.NomCompagnie                             AS 'Nom Compagnie Départ',
           tb01.IdVoyage                                 AS 'Numero',
           tb10.IdVille                                  AS 'ID1',
           tb10.NomVille                                 AS 'Ville de Départ',
           tb04.NomGare                                  AS 'Gare de Départ',
           tb02.HeureDepart                              AS 'Heure de Départ',
           tb11.IdVille                                  AS 'ID2',
           tb11.NomVille                                 AS 'Ville d''Arrivée',
           tb05.NomGare                                  AS 'Gare d''Arrivée',
           tb03.HeureArrivee                             AS 'Heure d''Arrivée',
           timediff(tb03.HeureArrivee, tb02.HeureDepart) AS 'Durée',
           tb01.NbrePlace                                AS 'Nombre de Places',
           tb01.Montant                                  AS 'Prix du Trajet'
     
    FROM       voyage           AS tb01
     
    INNER JOIN depart           AS tb02
    ON tb02.idDepart    = tb01.idDepart
     
    INNER JOIN arrivee          AS tb03
    ON tb03.idArrivee   = tb01.idArrivee
     
    INNER JOIN gare             AS tb04
    ON tb04.idGare      = tb02.idGare
     
    INNER JOIN gare             AS tb05
    ON tb05.idGare      = tb03.idGare
     
    INNER JOIN compagnie        AS tb06
    ON tb06.IdCompagnie = tb04.IdCompagnie
     
    INNER JOIN compagnie        AS tb07
    ON tb07.IdCompagnie = tb05.IdCompagnie
     
    INNER JOIN commune          AS tb08
    ON tb08.idCommune   = tb04.idCommune
     
    INNER JOIN commune          AS tb09
    ON tb09.idCommune   = tb05.idCommune
     
    INNER JOIN ville            AS tb10
    ON tb10.idVille     = tb08.idVille
     
    INNER JOIN ville            AS tb11
    ON tb11.idVille     = tb09.idVille
     
    WHERE tb06.IDCompagnie = 1
    --------------
     
    +---------------+----------------------+--------+-----+-----------------+----------------+-----------------+-----+-----------------+----------------+-----------------+----------+------------------+----------------+
    | IDComp Départ | Nom Compagnie Départ | Numero | ID1 | Ville de Départ | Gare de Départ | Heure de Départ | ID2 | Ville d'Arrivée | Gare d'Arrivée | Heure d'Arrivée | Durée    | Nombre de Places | Prix du Trajet |
    +---------------+----------------------+--------+-----+-----------------+----------------+-----------------+-----+-----------------+----------------+-----------------+----------+------------------+----------------+
    |             1 | utb                  |      1 |   1 | Abidjan         | Gare d'Abidjan | 15:00:00        |   2 | Bouaké          | Gare de Bouaké | 19:00:00        | 04:00:00 |                5 |         127.25 |
    |             1 | utb                  |      2 |   2 | Bouaké          | Gare de Bouaké | 08:30:00        |   1 | Abidjan         | Gare d'Abidjan | 12:00:00        | 03:30:00 |               17 |          75.00 |
    +---------------+----------------------+--------+-----+-----------------+----------------+-----------------+-----+-----------------+----------------+-----------------+----------+------------------+----------------+
    --------------
    set @date_a_tester = null
    --------------
     
    --------------
    SELECT tb06.IdCompagnie                              AS 'IDComp Départ',
           tb06.NomCompagnie                             AS 'Nom Compagnie Départ',
           tb01.IdVoyage                                 AS 'Numero',
           tb10.IdVille                                  AS 'ID1',
           tb10.NomVille                                 AS 'Ville de Départ',
           tb04.NomGare                                  AS 'Gare de Départ',
           tb02.HeureDepart                              AS 'Heure de Départ',
           tb11.IdVille                                  AS 'ID2',
           tb11.NomVille                                 AS 'Ville d''Arrivée',
           tb05.NomGare                                  AS 'Gare d''Arrivée',
           tb03.HeureArrivee                             AS 'Heure d''Arrivée',
           timediff(tb03.HeureArrivee, tb02.HeureDepart) AS 'Durée',
           tb01.NbrePlace                                AS 'Nombre de Places',
           tb01.Montant                                  AS 'Prix du Trajet'
     
    FROM       voyage           AS tb01
     
    INNER JOIN depart           AS tb02
    ON tb02.idDepart    = tb01.idDepart
     
    INNER JOIN arrivee          AS tb03
    ON tb03.idArrivee   = tb01.idArrivee
     
    INNER JOIN gare             AS tb04
    ON tb04.idGare      = tb02.idGare
     
    INNER JOIN gare             AS tb05
    ON tb05.idGare      = tb03.idGare
     
    INNER JOIN compagnie        AS tb06
    ON tb06.IdCompagnie = tb04.IdCompagnie
     
    INNER JOIN compagnie        AS tb07
    ON tb07.IdCompagnie = tb05.IdCompagnie
     
    INNER JOIN commune          AS tb08
    ON tb08.idCommune   = tb04.idCommune
     
    INNER JOIN commune          AS tb09
    ON tb09.idCommune   = tb05.idCommune
     
    INNER JOIN ville            AS tb10
    ON tb10.idVille     = tb08.idVille
     
    INNER JOIN ville            AS tb11
    ON tb11.idVille     = tb09.idVille
     
    WHERE tb06.IDCompagnie = 1
      AND NOT EXISTS (SELECT 1
                      FROM exception as tb51
                      where tb51.idVoyage = tb01.idVoyage
                        and tb51.numJour  = weekday( coalesce(@date_a_tester, now() ) ) + 1
                     )
    --------------
     
    +---------------+----------------------+--------+-----+-----------------+----------------+-----------------+-----+-----------------+----------------+-----------------+----------+------------------+----------------+
    | IDComp Départ | Nom Compagnie Départ | Numero | ID1 | Ville de Départ | Gare de Départ | Heure de Départ | ID2 | Ville d'Arrivée | Gare d'Arrivée | Heure d'Arrivée | Durée    | Nombre de Places | Prix du Trajet |
    +---------------+----------------------+--------+-----+-----------------+----------------+-----------------+-----+-----------------+----------------+-----------------+----------+------------------+----------------+
    |             1 | utb                  |      2 |   2 | Bouaké          | Gare de Bouaké | 08:30:00        |   1 | Abidjan         | Gare d'Abidjan | 12:00:00        | 03:30:00 |               17 |          75.00 |
    +---------------+----------------------+--------+-----+-----------------+----------------+-----------------+-----+-----------------+----------------+-----------------+----------+------------------+----------------+
    --------------
    set @date_a_tester = '2016-06-21'
    --------------
     
    --------------
    SELECT tb06.IdCompagnie                              AS 'IDComp Départ',
           tb06.NomCompagnie                             AS 'Nom Compagnie Départ',
           tb01.IdVoyage                                 AS 'Numero',
           tb10.IdVille                                  AS 'ID1',
           tb10.NomVille                                 AS 'Ville de Départ',
           tb04.NomGare                                  AS 'Gare de Départ',
           tb02.HeureDepart                              AS 'Heure de Départ',
           tb11.IdVille                                  AS 'ID2',
           tb11.NomVille                                 AS 'Ville d''Arrivée',
           tb05.NomGare                                  AS 'Gare d''Arrivée',
           tb03.HeureArrivee                             AS 'Heure d''Arrivée',
           timediff(tb03.HeureArrivee, tb02.HeureDepart) AS 'Durée',
           tb01.NbrePlace                                AS 'Nombre de Places',
           tb01.Montant                                  AS 'Prix du Trajet'
     
    FROM       voyage           AS tb01
     
    INNER JOIN depart           AS tb02
    ON tb02.idDepart    = tb01.idDepart
     
    INNER JOIN arrivee          AS tb03
    ON tb03.idArrivee   = tb01.idArrivee
     
    INNER JOIN gare             AS tb04
    ON tb04.idGare      = tb02.idGare
     
    INNER JOIN gare             AS tb05
    ON tb05.idGare      = tb03.idGare
     
    INNER JOIN compagnie        AS tb06
    ON tb06.IdCompagnie = tb04.IdCompagnie
     
    INNER JOIN compagnie        AS tb07
    ON tb07.IdCompagnie = tb05.IdCompagnie
     
    INNER JOIN commune          AS tb08
    ON tb08.idCommune   = tb04.idCommune
     
    INNER JOIN commune          AS tb09
    ON tb09.idCommune   = tb05.idCommune
     
    INNER JOIN ville            AS tb10
    ON tb10.idVille     = tb08.idVille
     
    INNER JOIN ville            AS tb11
    ON tb11.idVille     = tb09.idVille
     
    WHERE tb06.IDCompagnie = 1
      AND NOT EXISTS (SELECT 1
                      FROM exception as tb51
                      where tb51.idVoyage = tb01.idVoyage
                        and tb51.numJour  = weekday( coalesce(@date_a_tester, now() ) ) + 1
                     )
    --------------
     
    +---------------+----------------------+--------+-----+-----------------+----------------+-----------------+-----+-----------------+----------------+-----------------+----------+------------------+----------------+
    | IDComp Départ | Nom Compagnie Départ | Numero | ID1 | Ville de Départ | Gare de Départ | Heure de Départ | ID2 | Ville d'Arrivée | Gare d'Arrivée | Heure d'Arrivée | Durée    | Nombre de Places | Prix du Trajet |
    +---------------+----------------------+--------+-----+-----------------+----------------+-----------------+-----+-----------------+----------------+-----------------+----------+------------------+----------------+
    |             1 | utb                  |      1 |   1 | Abidjan         | Gare d'Abidjan | 15:00:00        |   2 | Bouaké          | Gare de Bouaké | 19:00:00        | 04:00:00 |                5 |         127.25 |
    |             1 | utb                  |      2 |   2 | Bouaké          | Gare de Bouaké | 08:30:00        |   1 | Abidjan         | Gare d'Abidjan | 12:00:00        | 03:30:00 |               17 |          75.00 |
    +---------------+----------------------+--------+-----+-----------------+----------------+-----------------+-----+-----------------+----------------+-----------------+----------+------------------+----------------+
    --------------
    commit
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

  20. #20
    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
    Le problème persiste toujours malgré que j'ai insérer la fonction coalesce. Je pense que le problème se trouve au niveau de la valeur renvoyer par le champ de date lorsque l'utilisateur de saisie pas de date. Voici mon code :

    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
    if (isset($_POST["rechercher"])) {
    		$vil_dep = $_POST["ville_dep"];
    		$vil_arriv = $_POST["ville_arriv"];
    		$comp = $_POST["comp"];
    		
    		if (empty($_POST["date"])) {
    			$date2=null;
    		}
    
    		elseif(isset($_POST["date"]) AND !empty($_POST["date"])){
    			$date1 = $_POST["date"];
    			$date = date_create($date1);
    			$date2 = date_format($date,'Y-m-d');
    			$date = date_format($date,'d/m/Y');
    		}
    		
    		//var_dump($comp);
    		$search = $con->prepare("SELECT tb01.IdCompagnie                AS 'IDComp Départ',
    						       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 (tb09.IdVille= ? AND tb10.IdVille = ? AND tb01.IdCompagnie = ?)
    								
    								AND NOT EXISTS (SELECT 1
    				                				FROM exception as tb51
    			                    				WHERE tb51.IdVoyage = tb02.IdVoyage
    			                    				AND tb51.NumJour = WEEKDAY(COALESCE('$date2',NOW()))+1
    			                    				)				
    							");
    Je pense que le problème se trouve dans la partie de code en rouge mais je n'arrive pas à comprendre. Pourtant quand l'utilisateur choisit de renseigner une date, aucune erreur ne s'affiche ce qui veut dire que les instructions du elseif ont bien été interprété. Que dois-je faire SVP ?

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

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