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 :

Trouver les dates manquantes entre 2 dates ?


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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    En faisant tout simplement une procédure stockée, comme dans mon exemple ci-après :
    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
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `manquant`
    --------------
     
    --------------
    create table `manquant`
    ( `date`  date  not null primary key
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    create table `test`
    ( `id`      integer  unsigned  not null auto_increment primary key,
      `date`    date           not null,
      `depart`  smallint       not null,
      `arrive`  smallint       not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`date`,`depart`,`arrive`) VALUES
      ('2019-05-25', 12, 45),
      ('2019-05-27', 25,  4),
      ('2019-05-28', 43, 56),
      ('2019-05-29',  7,  5),
      ('2019-05-30',  8,  2),
      ('2019-06-01',  3, 17),
      ('2019-06-03',  8, 12),
      ('2019-06-04', 39,  2),
      ('2019-06-06', 15, 15),
      ('2019-07-07', 17,  5)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+------------+--------+--------+
    | id | date       | depart | arrive |
    +----+------------+--------+--------+
    |  1 | 2019-05-25 |     12 |     45 |
    |  2 | 2019-05-27 |     25 |      4 |
    |  3 | 2019-05-28 |     43 |     56 |
    |  4 | 2019-05-29 |      7 |      5 |
    |  5 | 2019-05-30 |      8 |      2 |
    |  6 | 2019-06-01 |      3 |     17 |
    |  7 | 2019-06-03 |      8 |     12 |
    |  8 | 2019-06-04 |     39 |      2 |
    |  9 | 2019-06-06 |     15 |     15 |
    | 10 | 2019-07-07 |     17 |      5 |
    +----+------------+--------+--------+
    --------------
    DROP PROCEDURE IF EXISTS `existence`
    --------------
     
    --------------
    CREATE PROCEDURE `existence`(IN _deb date, IN _fin date)
    BEGIN
            DECLARE _flag INTEGER DEFAULT NULL;
            DECLARE _date DATE    DEFAULT NULL;
     
            SET _DATE = _deb;
     
            WHILE (_DATE < _fin)
            DO
                    SET _flag = (select 1 from `test` where `date` = _date);
     
                    IF (_FLAG is null) THEN
                            insert into `manquant` (`date`) values (_date);
                    END IF;
     
                    SET _DATE = _DATE + interval 1 day;
            END WHILE;
    END
    --------------
     
    --------------
    call `existence` ('2019-05-25','2019-06-07')
    --------------
     
    --------------
    select * from `manquant`
    --------------
     
    +------------+
    | date       |
    +------------+
    | 2019-05-26 |
    | 2019-05-31 |
    | 2019-06-02 |
    | 2019-06-05 |
    +------------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Et pas besoin de calendrier !

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

  2. #22
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Merci mais est-ce que MySQL sait faire des procédures stockées ???
    Et puis, comment je peux l'exécuter à partir de la page html ???

    Vous m'avez perdu
    Zeb'...

  3. #23
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Zebulon777.

    Tu as le bonjour du père Pivoine et de la petite Margote (du manège enchanté) !

    Mon est exemple a été testé sous mysql version 8.0.16.
    Comment l'exécuté ?
    De la même façon qu'un select, mais avec la ligne "call `existence` ('2019-05-25','2019-06-07')".

    La procédure stockée doit être présente dans la base de données mysql, à l'instar des tables mysql.

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

  4. #24
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut Zebulon777.

    Tu as le bonjour du père Pivoine et de la petite Margote (du manège enchanté) !
    Merci

    Citation Envoyé par Artemus24 Voir le message
    Mon est exemple a été testé sous mysql version 8.0.16.
    Comment l'exécuté ?
    De la même façon qu'un select, mais avec la ligne "call `existence` ('2019-05-25','2019-06-07')".

    La procédure stockée doit être présente dans la base de données mysql, à l'instar des tables mysql.

    @+
    Je travaille avec Wamp et Lamp et nous sommes en version MySQL 5.7.21 et je ne sais pas du tout s'il est possible de la mettre à jour.

    Je ne connais pas du tout le principe des procédures stockées.
    Donc, si j'ai bien compris, en reprenant ton code et en supprimant ce qui ne me servirait pas, ça donnerait :
    Code sql : 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
     
    START TRANSACTION;
    DROP TABLE IF EXISTS `dates_manquantes`;
    create table `dates_manquantes`
    ( `date`  date  not null primary key
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`utf8` COLLATE=`utf8_general_ci`
      ROW_FORMAT=COMPRESSED;
    DROP PROCEDURE IF EXISTS `existence_dates`;
    CREATE PROCEDURE `existence_dates`(IN _deb date, IN _fin date);
    BEGIN
            DECLARE _flag INTEGER DEFAULT NULL;
            DECLARE _date DATE    DEFAULT NULL;
     
            SET _DATE = _deb;
     
            WHILE (_DATE < _fin)
            DO
                    SET _flag = (select 1 from `heurglis_lfpo` where `hg_date` = _date);
     
                    IF (_FLAG is null) THEN
                            insert into `dates_manquantes` (`date`) values (_date);
                    END IF;
     
                    SET _DATE = _DATE + interval 1 day;
            END WHILE;
    END;
    COMMIT;
    (Est-ce que les ";" sont au bons endroits ?)

    Par contre, j'utilise phpMyAdmin et je ne vois pas comment créer la procédure stockées ? Dans l'onglet "Procédures stockées" de phpMyAdmin, il n'y a pas de possibilité de saisir le code sql ?
    Si je copie ce code dans la zone de saisie SQL, j'ai des erreurs et avec mes maigres compétences SQL, je n'arrive pas à corriger ce qui cloche.
    Est-ce que les lignes "start transaction" et "commit" sont nécessaires ?

    Bon, en résumé, je suis perdu.
    Zeb'...

  5. #25
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Zebulon777.

    Voici le source dont je me suis servi.
    Ce que je vous ai donné précédemment est l'exécution de ce source.
    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
    START TRANSACTION;
     
    -- ======================
    -- Base de Données `base`
    -- ======================
     
    DROP DATABASE IF EXISTS `base`;
     
    CREATE DATABASE IF NOT EXISTS `base`
    	DEFAULT CHARACTER SET `latin1`
    	DEFAULT COLLATE       `latin1_general_ci`;
     
    USE `base`;
     
    -- ================
    -- Table `manquant`
    -- ================
     
    DROP TABLE IF EXISTS `manquant`;
     
    create table `manquant`
    ( `date`  date  not null primary key
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- ============
    -- Table `test`
    -- ============
     
    DROP TABLE IF EXISTS `test`;
     
    create table `test`
    ( `id`      integer  unsigned  not null auto_increment primary key,
      `date`    date           not null,
      `depart`  smallint       not null,
      `arrive`  smallint       not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- =====================
    -- insertion dans `test`
    -- =====================
     
    INSERT INTO `test` (`date`,`depart`,`arrive`) VALUES
      ('2019-05-25', 12, 45),
      ('2019-05-27', 25,  4),
      ('2019-05-28', 43, 56),
      ('2019-05-29',  7,  5),
      ('2019-05-30',  8,  2),
      ('2019-06-01',  3, 17),
      ('2019-06-03',  8, 12),
      ('2019-06-04', 39,  2),
      ('2019-06-06', 15, 15),
      ('2019-07-07', 17,  5);
     
    -- ================
    -- vidage de `test`
    -- ================
     
    select * from `test`;
     
    -- =================
    -- Procédure stockée
    -- =================
     
    DELIMITER $$
    DROP PROCEDURE IF EXISTS `existence`$$
     
    CREATE PROCEDURE `existence`(IN _deb date, IN _fin date)
    BEGIN
    	DECLARE _flag INTEGER DEFAULT NULL;
    	DECLARE _date DATE    DEFAULT NULL;
     
    	SET _DATE = _deb;
     
    	WHILE (_DATE < _fin)
    	DO
    		SET _flag = (select 1 from `test` where `date` = _date);
     
    		IF (_FLAG is null) THEN
    			insert into `manquant` (`date`) values (_date);
    		END IF;
     
    		SET _DATE = _DATE + interval 1 day;
    	END WHILE;
    END $$
    DELIMITER ;
     
    -- ===========
    -- Requête N°1
    -- ===========
     
    call `existence` ('2019-05-25','2019-06-07');
     
    select * from `manquant`;
     
    -- ===
    -- FIN
    -- ===
     
    COMMIT;
    EXIT
    Citation Envoyé par Zebulon777
    je ne sais pas du tout s'il est possible de la mettre à jour.
    On peut le faire, mais il faut s'y connaitre.
    Récupérer la dernière version (8.0.16), la dézipper et recopier la partie utile n'est pas très compliqué à faire.
    Mais vous devez créer le répertoire "/data" car le répertoire n'existe pas.
    Mais ensuite, vous devez faire le paramétrage de mysql, entre autre les mots de passe, les comptes.
    Le mieux est de demander à Otomatic, en vous rendant dans le forum wampserver.

    Citation Envoyé par Zebulon777
    Je ne connais pas du tout le principe des procédures stockées.
    C'est un traitement que l'on associe à une base de données.
    Tout ce que l'on peut faire dans une procédure stockée, se fait aussi dans une application.
    L'avantage est que le traitement se fait coté serveur mysql.

    Citation Envoyé par Zebulon777
    je ne vois pas comment créer la procédure stockées ?
    Vous cliquez sur la base de données.
    Quand celle-ci est sélectionnée, vous cliquez sur l'onglet "sql" et vous insérez la partie utilise de la procédure stockées.
    Vous validez et c'est tout.
    La partie utilise, c'est ça :
    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
    DELIMITER $$
    DROP PROCEDURE IF EXISTS `existence`$$
     
    CREATE PROCEDURE `existence`(IN _deb date, IN _fin date)
    BEGIN
    	DECLARE _flag INTEGER DEFAULT NULL;
    	DECLARE _date DATE    DEFAULT NULL;
     
    	SET _DATE = _deb;
     
    	WHILE (_DATE < _fin)
    	DO
    		SET _flag = (select 1 from `test` where `date` = _date);
     
    		IF (_FLAG is null) THEN
    			insert into `manquant` (`date`) values (_date);
    		END IF;
     
    		SET _DATE = _DATE + interval 1 day;
    	END WHILE;
    END $$
    DELIMITER ;
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #26
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Merci pour ta précieuse aide et ta patience.

    Je ne peux pas modifier la version de MySql pour le moment, car je n'ai pas le retour de l'administrateur de la base, mais a priori, ça sera non car, il y aurait trop de choses impactées, d'après ce qu'on ma dit (grosse boite = administration = inertie ! )

    Mais lorsque je copie ton code, j'ai une erreur à tous les " ; " : caractère inattendu. (près de ;)
    Nom : sql.png
Affichages : 105
Taille : 9,8 Ko
    Zeb'...

  7. #27
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Zebulon777.

    Je viens de faire le test chez moi, comme je l'ai indiqué et ça fonctionne.

    Je clique sur ma base de données, dans la colonne de gauche. Ma base se nomme "BASE".
    Je clique sur l'onglet "SQL" et je recopie dans la fenêtre, ce que je vous ai indiqué. Voici le résultat :



    Comme on peut le voir dans la colonne de gauche, la procédure stockée a été créé sous le nom "existence".
    Je clique sur cette procédure stockée, toujours dans la colonne à gauche, et voici le résultat :



    Je pense soit que vous avez un problème d'environnement ou plus simplement, vous n'êtes pas habilité à créer des procédures stockées.

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

  8. #28
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    C'est fou cette histoire !
    Y a rien à faire ; j'ai toujours la même erreur erreur !
    Or je fais très exactement ce que vous dites.
    Je ne comprends pas !
    A part un problème de version, je ne vois pas.

    Nom : sql2.png
Affichages : 122
Taille : 33,2 Ko
    Zeb'...

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

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Un problème de caracère de fin de ligne (CR/LF vs LF) ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  10. #30
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    A priori, il ne reconnait pas le point-virgule.
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #31
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Bonne idée, mais Notepad++ donne bien du crlf.

    Nom : sql3.png
Affichages : 148
Taille : 20,8 Ko
    Zeb'...

  12. #32
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    A priori, il ne reconnait pas le point-virgule.
    Oui, mais si je fais d'autres requêtes sql avec " ; ", il n'y a pas d'erreur ! ?
    Zeb'...

  13. #33
    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 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Zebulon777.

    Vu que cela fonctionne chez moi, je vous conseille de ne pas copier/coller la séquence des instructions mais de le saisir manuellement.
    Il y a peut-être un truc invisible qui ne passe pas.

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

  14. #34
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Salut les gars et merci encore pour votre aide.

    Je relance la discussion car j'ai un comportement bizarre :

    - J'ai utilisé la méthode de la table CALENDRIER qui est remplie jusqu'en 2050, ça laisse le temps de voir venir
    - Avec la table HEURGLIS_LFPG, ça fonctionne impec, avec une réponse rapide.
    - Avec la table TRAFJOUR_4PLTF, la réponse est très très longue à venir.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Requête utilisée avec la table HEURGLIS_LFPG: 
    $query = "select * from CALENDRIER as cl where not exists (select 1 from " . $WTable . " as tb ";
    $query = $query . "where tb.hg_date = cl.date) and cl.date between '" . $WDateDeb . "' and '" . $WDateFin . "'";
    
    Requête utilisée avec la table TRAFJOUR_4PLTF: 
    $query = "select * from CALENDRIER as cl where not exists (select 1 from " . $WTable . " as tb ";
    $query = $query . "where tb.st_pltf = '" . $WPltf . "' and tb.st_date_mouv_n = cl.date) and cl.date between '" . $WDateDeb . "' and '" . $WDateFin . "'";

    Code sql : 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
     
    Structure des tables :
    CREATE TABLE `CALENDRIER` (
      `date` date DEFAULT NULL,
      `id` int(11) NOT NULL,
      `y` smallint(6) DEFAULT NULL,
      `m` smallint(6) DEFAULT NULL,
      `d` smallint(6) DEFAULT NULL,
      `yw` smallint(6) DEFAULT NULL,
      `w` smallint(6) DEFAULT NULL,
      `q` smallint(6) DEFAULT NULL,
      `wd` smallint(6) DEFAULT NULL,
      `m_name` char(10) COLLATE utf8_unicode_ci DEFAULT NULL,
      `wd_name` char(10) COLLATE utf8_unicode_ci DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Table chargé du 01/01/2015 au 31/12/2049 permettant de trouver les dates manquantes dans les tables (ControlesBDD)';
     
    CREATE TABLE `heurglis_lfpg` (
      `HG_DATE` date NOT NULL,
      `HG_HOURS_UTC` text COLLATE utf8_unicode_ci NOT NULL,
      `ARR_09L` smallint(5) NOT NULL,
      `ARR_27R` smallint(5) NOT NULL,
      `ARR_09R` smallint(5) NOT NULL,
      `ARR_27L` smallint(5) NOT NULL,
      `ARR_08L` smallint(5) NOT NULL,
      `ARR_26R` smallint(5) NOT NULL,
      `ARR_08R` smallint(5) NOT NULL,
      `ARR_26L` smallint(5) NOT NULL,
      `TOT_ARR` smallint(5) NOT NULL,
      `DEP_09L` smallint(5) NOT NULL,
      `DEP_27R` smallint(5) NOT NULL,
      `DEP_09R` smallint(5) NOT NULL,
      `DEP_27L` smallint(5) NOT NULL,
      `DEP_08L` smallint(5) NOT NULL,
      `DEP_26R` smallint(5) NOT NULL,
      `DEP_08R` smallint(5) NOT NULL,
      `DEP_26L` smallint(5) NOT NULL,
      `TOT_DEP` smallint(5) NOT NULL,
      `TOT_GEN` smallint(5) NOT NULL,
      `TOT_ARR_DN` smallint(5) NOT NULL,
      `TOT_DEP_DN` smallint(5) NOT NULL,
      `TOT_DN` smallint(5) NOT NULL,
      `TOT_ARR_DS` smallint(5) NOT NULL,
      `TOT_DEP_DS` smallint(5) NOT NULL,
      `TOT_DS` smallint(5) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Fichier(s) source(s) : AAAA_MM_JJ_plateforme_lfpg_gliss_1h.csv';
     
    CREATE TABLE `trafjour_4pltf` (
      `ST_ANNEE_REF` smallint(4) NOT NULL,
      `ST_DATE_MOUV_N` date NOT NULL,
      `ST_NUM_SEMAINE_N` smallint(2) NOT NULL,
      `ST_NOM_JOUR_N` text COLLATE utf8_unicode_ci NOT NULL,
      `ST_PLTF` text COLLATE utf8_unicode_ci NOT NULL,
      `ST_NB_MOUV_ARR_N` smallint(4) DEFAULT NULL,
      `ST_NB_MOUV_DEP_N` smallint(4) DEFAULT NULL,
      `ST_DATE_MOUV_N1` date NOT NULL,
      `ST_NB_MOUV_ARR_N1` smallint(4) DEFAULT NULL,
      `ST_NB_MOUV_DEP_N1` smallint(4) DEFAULT NULL,
      `ST_DATE_MOUV_N2` date NOT NULL,
      `ST_NB_MOUV_ARR_N2` smallint(4) DEFAULT NULL,
      `ST_NB_MOUV_DEP_N2` smallint(4) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Table calculée - LFPG - LFPO - LFPB - LFOB';

    J'espère vous avoir donné assez d'information pour que vous puissiez m'aider.

    Merci d'avance.
    Zeb'...

  15. #35
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Vérifiez s'il existe des index sur les critères de recherche du NOT EXISTS (where de la requête correlée)
    si c'est le cas, vérifiez que vos variables sont bien du même type que les colonnes qu'elles alimentent, car sinon, les index ne sont pas éligibles.

    Note : on voit souvent des noms de table ou de colonne à rallonge, ici c'est l'inverse. Vos noms de colonnes sont trop courts (id, y, m, d...) c'est peu parlant, peu lisible et source de confusion.

  16. #36
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Merci pour tes conseils avisés que je veux bien suivre à la lettre mais je ne comprends pas : il faut que je créé un index sur quoi exactement ? Sur la table CALENDRIER ou sur les autres tables ? Et sur quels champs ?

    Je vais modifier les nom des colonnes de la table CALENDRIER.

    A suivre.
    Zeb'...

  17. #37
    Membre actif Avatar de Zebulon777
    Homme Profil pro
    Informaticien
    Inscrit en
    Février 2005
    Messages
    1 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Février 2005
    Messages : 1 319
    Points : 286
    Points
    286
    Par défaut
    Bon, je viens d'ajouter 1 index à la table trafjour_4pltf et c'est impec !

    Voici l'export de phpMyAdmin :
    Code sql : 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
     
    -- phpMyAdmin SQL Dump
    -- version 4.5.4.1deb2ubuntu2.1
    -- http://www.phpmyadmin.net
    --
    -- Client :  localhost
    -- Généré le :  Mar 30 Juillet 2019 à 11:19
    -- Version du serveur :  5.7.27-0ubuntu0.16.04.1
    -- Version de PHP :  7.0.33-0ubuntu0.16.04.5
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
     
    --
    -- Base de données :  `...`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `trafjour_4pltf`
    --
     
    CREATE TABLE `trafjour_4pltf` (
      `ST_ANNEE_REF` smallint(4) NOT NULL,
      `ST_DATE_MOUV_N` date NOT NULL,
      `ST_NUM_SEMAINE_N` smallint(2) NOT NULL,
      `ST_NOM_JOUR_N` char(8) COLLATE utf8_unicode_ci NOT NULL,
      `ST_PLTF` char(4) COLLATE utf8_unicode_ci NOT NULL,
      `ST_NB_MOUV_ARR_N` smallint(4) DEFAULT NULL,
      `ST_NB_MOUV_DEP_N` smallint(4) DEFAULT NULL,
      `ST_DATE_MOUV_N1` date NOT NULL,
      `ST_NB_MOUV_ARR_N1` smallint(4) DEFAULT NULL,
      `ST_NB_MOUV_DEP_N1` smallint(4) DEFAULT NULL,
      `ST_DATE_MOUV_N2` date NOT NULL,
      `ST_NB_MOUV_ARR_N2` smallint(4) DEFAULT NULL,
      `ST_NB_MOUV_DEP_N2` smallint(4) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Table calculée - LFPG - LFPO - LFPB - LFOB';
     
    --
    -- Index pour les tables exportées
    --
     
    --
    -- Index pour la table `trafjour_4pltf`
    --
    ALTER TABLE `trafjour_4pltf`
      ADD KEY `ST_ANNEE_REF` (`ST_ANNEE_REF`,`ST_DATE_MOUV_N`),
      ADD KEY `ST_DATE_MOUV_N` (`ST_DATE_MOUV_N`),
      ADD KEY `ST_DATE_MOUV_N_2` (`ST_DATE_MOUV_N`,`ST_PLTF`);
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

    Ca fonctionne avec le dernier index que j'ai ajouté, la réponse est maintenant presque qu'immédiate.

    Merci beaucoup pour tes conseils.
    Zeb'...

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

Discussions similaires

  1. comment trouver les dates max en multi-tables ?
    Par S.H dans le forum Bases de données
    Réponses: 5
    Dernier message: 31/07/2015, 08h00
  2. [XL-2007] trouver les date des dimanche d'un mois donné
    Par Smilossss dans le forum Excel
    Réponses: 10
    Dernier message: 30/04/2013, 17h40
  3. Trouver les dates entre deux dates
    Par lilp1 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/05/2009, 16h05
  4. Comment trouver les valeurs manquante d'une série ?
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/10/2006, 09h38
  5. [INSTALL] où trouver les packages manquant ?
    Par cdu dans le forum Oracle
    Réponses: 4
    Dernier message: 01/04/2006, 12h03

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