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

MySQL Discussion :

Requêtes multiple en Update et insert into


Sujet :

MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut Requêtes multiple en Update et insert into
    Bonjour à vous tous,
    J'ai un serveur qui récupère des informations de téléreleves, il s'agit de points 10 min sur 15 jours glissants. Ces mesures sont stockes dans des fichiers textes.
    J'ai donc crée un script en Php pour parcourir mes fichiers et les rajouter dans ma base de données.
    Aujourd'hui je parcours mon fichier si la date et l'heure de mon point existe alors je met a jour la donnée, sinon je la crée.
    Mon problème est le suivant:
    J’exécute une requête pour chaque valeur. Mon serveur lance beaucoup de script de ce genre en peu de temps, de ce fait il faut que j'optimise au maximum ce script.
    Ce que j'aimerai:
    Implémenter ma requête du genre sql_insert = " ......" pour tous mes insert et sql_update pour mes updates.
    Et une fois que j'ai parcourus tous mon fichier il me faut faire deux requetes.

    Je connais pas la synthaxe, ou les techniques les plus adaptées,
    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Importez votre fichier texte dans une table de la BDD puis traitez les données en une ou deux requêtes.

    Si vous nous donnez la structure des tables impliquées et de votre fichier texte, on pourra vous aider à construire ce qu'il faut.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut Reponse
    Bonjour et merci pour votre réponse,
    J'ai un dossier, dans lequel j'ai 32 dossiers dans lesquels j'ai 4 fichiers TEXTE 1,2,3,4.
    Les 4 fichiers ont la même strucuture,

    24/02/2015 12:00 777 704 628 637 551 538
    24/02/2015 13:00 574 501 490 516 596 511
    24/02/2015 14:00 498 481 426 450 405 290
    24/02/2015 15:00 289 346 365 408 337 445
    24/02/2015 16:00 481 481 413 232 123 86
    24/02/2015 17:00 86 51 29 13 7 1
    24/02/2015 18:00 0 0 0 0 0 0
    24/02/2015 19:00 0 0 0 0 0 0
    24/02/2015 20:00 0 0 0 0 0 0
    24/02/2015 21:00 0 0 0 0 0 0
    24/02/2015 22:00 0 0 0 0 0 0
    24/02/2015 23:00 0 0 0 0 0 0
    25/02/2015 00:00 0 0 0 0 0 0
    25/02/2015 01:00 0 0 0 0 0 0
    25/02/2015 02:00 0 0 0 0 0 0
    25/02/2015 03:00 0 0 0 0 0 0
    25/02/2015 04:00 0 0 0 0 0 0
    25/02/2015 05:00 0 0 0 0 0 0
    25/02/2015 06:00 0 0 0 0 0 0
    25/02/2015 07:00 0 2 1 31 76 158
    25/02/2015 08:00 174 235 420 627 623 562

    Par exemple la deuxième colonne de la 1 ligne correspond a la valeur pour 12:00 la troisième correspond a 12:10 et cela jusqu’à 12:50.

    Chacun des 32 dossiers ont la même structure: Un nom propre a chaque dossier.

    Ma table a la strcuture suivante:

    Date & heure Valeur Du fichier1 Valeur du fichier2 valeurdufichier3 Valeurdufichier4
    24/02/2015 12:00 777 2 3 4
    24/02/2015 12:10 574 2 3 4

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    il s'agit de points 10 min sur 15 jours glissants
    ...
    J'ai un dossier, dans lequel j'ai 32 dossiers dans lesquels j'ai 4 fichiers TEXTE 1,2,3,4.
    Pourquoi 30 dossiers et 4 fichiers ?

    Créez une table d'import :
    import(date_heure, zero, dix, vingt, trente, quarante, cinquante)

    Importez le fichier 1 dedans.

    Aujourd'hui je parcours mon fichier si la date et l'heure de mon point existe alors je met a jour la donnée, sinon je la crée.
    Voici la requête de mise à jour pour le fichier 1 et les mesures à l'heure juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE votre_table t1
    INNER JOIN import i ON i.date_heure = t1.date_heure
    SET t1.valeur_1 = i.zero
    C'est un truc de ce genre que vous cherchez ?

    Votre BDD est quand même mal modélisée. À quoi correspond chaque fichier ? Chaque répertoire ? N'avez-vous qu'une seule table pour recueillir tous les résultats ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    Bonsoir,
    Je suis obligé de faire de la sorte j'ai pas le choix!!
    Ma question est la suivante:
    C'est possible de faire insert into xxxxx (1,2,3,4) values (1,2,3,5) et ensuite (1,2,3,4) values (9,4,6,2) et ainsi de suite!
    Et en update ca donnerai
    Update xxxxxx set (1=3,2=4,3=3,4=5) where xxxx , set (1=4,2=3,3=9,4=2) where xxxx et ansi de suite

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par loic3484 Voir le message
    Ma question est la suivante:
    C'est possible de faire insert into xxxxx (1,2,3,4) values (1,2,3,5) et ensuite (1,2,3,4) values (9,4,6,2) et ainsi de suite!
    Et en update ca donnerai
    Update xxxxxx set (1=3,2=4,3=3,4=5) where xxxx , set (1=4,2=3,3=9,4=2) where xxxx et ansi de suite
    Euh... là je ne comprends pas trop l'idée mais j'avais bien compris le besoin de départ à partir de vos données exemple.

    Mais vous n'avez pas répondu à mes questions :
    Citation Envoyé par CinéPhil
    À quoi correspond chaque fichier ? Chaque répertoire ? N'avez-vous qu'une seule table pour recueillir tous les résultats ?
    Je demandais ça parce qu'en cherchant le type de requête qu'il vous faut, j'ai l'impression que ce ma solution ne sera pas forcément plus rapide que votre procédure actuelle. La jointure que j'ai donnée pourra être assez rapide en indexant la colonne date mais la requête ne fonctionne que pour les heures entières. Pour les dizaines de minutes intermédiaires, ça va être un peu plus compliqué et il ne sera plus possible de faire de jointure et d'utiliser les index, je pense.

    Donnez-nous la structure complète de votre table, résultat de SHOW CREATE TABLE nom_de_votre_table
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    32 dossiers car j'ai 32 compteurs différents, et 4 fichiers car je mesure 4 valeurs différentes. Chaque compteur est caractérisé par un nom.

    Je ne veux qu'une seule table pour recueillir toutes mes informations.

    L'idée pour chaque compteur j'associe un nom, une date et heure au format suivant: 2015-02-09 12:00:00.000 (tous les dix minutes) et les 4 valeurs .

    A l'heure d'aujourd'hui tout fonctionne, mon seul problème s'est que j'effectue une requete a chaque fois informations c'est tout.

    Soit a peu prés : 6 * 24 * 15 * 32* 4 = 276480 requettes

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je ne veux qu'une seule table pour recueillir toutes mes informations.
    Pourquoi ?
    Est-ce vous qui voulez ou est-ce le système que vous utilisez qui vous l'impose ?
    Une base de données avec une seule table, ce n'est pas une base de données ! Autant utiliser un tableur !

    Si vous avez la possibilité de modifier la structure de ta base de données, je vous conseille fortement de le faire. La complexité de votre problème est une illustration que votre modèle n'est pas adapté au besoin.

    32 dossiers car j'ai 32 compteurs différents
    Comment différenciez-vous les compteurs dans ta table unique ? D'après la structure que vous avez donnée de ta table, cette information n'y est pas !
    Date & heure Valeur Du fichier1 Valeur du fichier2 valeurdufichier3 Valeurdufichier4

    Revenons à votre problème...

    Vous avez actuellement des fichiers ayant cette structure :
    Date_heure / valeur_00 / valeur_10 / valeur_20 / valeur_30 / valeur_40 / valeur_50

    Importez un fichier dans une table import ayant la même structure.

    Créez une table transfert ayant cette structure :
    date_heure, valeur

    Puis faite la requête suivante pour transférer les données de votre table import vers votre table transfert :
    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
    INSERT INTO transfert (date_heure, valeur)
    SELECT date_heure, valeur_00
    FROM import
    UNION
    SELECT date_heure + INTERVAL 10 MINUTE, valeur_10
    FROM import
    UNION
    SELECT date_heure + INTERVAL 20 MINUTE, valeur_20
    FROM import
    UNION
    SELECT date_heure + INTERVAL 30 MINUTE, valeur_30
    FROM import
    UNION
    SELECT date_heure + INTERVAL 40 MINUTE, valeur_40
    FROM import
    UNION
    SELECT date_heure + INTERVAL 50 MINUTE, valeur_50
    FROM import
    Ensuite vous pouvez faire une jointure entre la table transfert et la table de données finale pour y ajouter ou modifier les données.

    Faites la même opération avec chaque fichier, soit 32 * 4 = 128 fois au lieu de plusieurs centaines de milliers de fois. Ce sera fait en masse beaucoup plus rapidement.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    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 378
    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 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à tous.

    J'ai une solution possible, en fonction de ce que j'ai compris du problème.

    Création d'une base de données :
    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
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
     
    -- ============
    -- Base `Essai`
    -- ============
     
    DROP DATABASE IF EXISTS `essai`;
     
    CREATE DATABASE `essai`
    	DEFAULT CHARACTER SET `utf8`
    	DEFAULT COLLATE       `utf8_general_ci`;
     
    USE `essai`;
     
    COMMIT;
     
    -- ================
    -- Table `entrepot`
    -- ================
     
    DROP TABLE IF EXISTS `entrepot`;
     
    CREATE TABLE `entrepot` (
      `Nom`        Char(12) NOT NULL,
      `Date`       date     NOT NULL,
      `Heure`      time     NOT NULL,
      `Rang`       SMALLINT NOT NULL,
      `Val`        int      NOT NULL,
      Primary Key (`Nom`,`Date`,`Heure`,`Rang`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`utf8` COLLATE=`utf8_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- ===================
    -- Trigger `increment`
    -- ===================
     
    DROP TRIGGER IF EXISTS `increment`;
     
    DELIMITER $$
    CREATE TRIGGER `increment`
    BEFORE INSERT ON `entrepot`
    FOR EACH ROW BEGIN
        SET NEW.Rang=ifnull((select max(Rang)+1 from `entrepot` where Nom=NEW.Nom and Date=NEW.Date and Heure=NEW.Heure),1);
    END$$
    DELIMITER ;
     
    -- =====================
    -- Procédure `rangement`
    -- =====================
     
    DROP PROCEDURE IF EXISTS Remplir;
     
    DELIMITER $$
    CREATE PROCEDURE Remplir
    (
    	IN In_Nom      CHAR(12),
    	IN In_Date     CHAR(10),
    	IN In_Heure    time,
    	IN In_Val1     int,
    	IN In_Val2     int,
    	IN In_Val3     int,
    	IN In_Val4     int,
    	IN In_Val5     int,
    	IN In_Val6     int
    )
    DETERMINISTIC
    NO SQL
    BEGIN
      DECLARE Out_Date date;
      SET Out_Date = str_to_date(In_Date,'%d/%m/%Y');
     
      insert into `entrepot` (`Nom`,`Date`,`Heure`,`Val`) value (In_Nom,Out_Date, addtime(In_Heure, '00:00:00'), In_Val1);
      insert into `entrepot` (`Nom`,`Date`,`Heure`,`Val`) value (In_Nom,Out_Date, addtime(In_Heure, '00:10:00'), In_Val2);
      insert into `entrepot` (`Nom`,`Date`,`Heure`,`Val`) value (In_Nom,Out_Date, addtime(In_Heure, '00:20:00'), In_Val3);
      insert into `entrepot` (`Nom`,`Date`,`Heure`,`Val`) value (In_Nom,Out_Date, addtime(In_Heure, '00:30:00'), In_Val4);
      insert into `entrepot` (`Nom`,`Date`,`Heure`,`Val`) value (In_Nom,Out_Date, addtime(In_Heure, '00:40:00'), In_Val5);
      insert into `entrepot` (`Nom`,`Date`,`Heure`,`Val`) value (In_Nom,Out_Date, addtime(In_Heure, '00:50:00'), In_Val6);
    END$$
    DELIMITER ;
     
    -- =====================
    -- Creation vue `result`
    -- =====================
     
    create view `result` (Nom, Date, Heure, Val1, Val2, Val3, Val4) as
    select   nom, date, heure, val, 0,   0,   0   from entrepot where rang = 1 union
    select   nom, date, heure, 0,   val, 0,   0   from entrepot where rang = 2 union
    select   nom, date, heure, 0,   0,   val, 0   from entrepot where rang = 3 union
    select   nom, date, heure, 0,   0,   0,   val from entrepot where rang = 4
    ;
     
    COMMIT;
     
    SET AUTOCOMMIT = 1;
    Voici ce que l'on traite en php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    USE `essai`;
     
    -- =========================
    -- Insertion dans `entrepot`
    -- =========================
     
    CALL Remplir('Fic1','24/02/2015','12:00', 1,  2,  3,  4,  5,  6);
    CALL Remplir('Fic1','24/02/2015','13:00', 7,  8,  9, 10, 11, 12);
     
    CALL Remplir('Fic1','24/02/2015','12:00', 1,  2,  3,  4,  5,  6);
    CALL Remplir('Fic1','24/02/2015','13:00', 7,  8,  9, 10, 11, 12);
     
    CALL Remplir('Fic1','24/02/2015','12:00', 1,  2,  3,  4,  5,  6);
    CALL Remplir('Fic1','24/02/2015','13:00', 7,  8,  9, 10, 11, 12);
     
    CALL Remplir('Fic1','24/02/2015','12:00', 1,  2,  3,  4,  5,  6);
    CALL Remplir('Fic1','24/02/2015','13:00', 7,  8,  9, 10, 11, 12);
     
    COMMIT;
     
    -- ======
    -- Vidage
    -- ======
     
    select * from result;
    Le CALL sert à faire l'insertion dans la table entrepôt.
    la View result permet d'obtenir une table organisé selon votre souhait.
    Val1 : valeur provenant du fichier 1 & ainsi de suite.

    Le fichier 2, c'est qu'en on trouve une double clef.
    Le fichier 3, c'est qu'en on trouve une triple clef.
    Le fichier 4, c'est qu'en on trouve une quadruple clef.

    La clef est constitué du nom du dossier, de la date et de l'heure.
    L'heure augmente de 10 minutes.

    En espérant avoir répondu à ton attente.

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

Discussions similaires

  1. Réponses: 31
    Dernier message: 29/04/2014, 09h40
  2. Probleme avec UPDATE et INSERT INTO
    Par cmoimeme dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/05/2006, 22h12
  3. [Débutant(e)] Création d'une requête update ou insert
    Par boulete dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/04/2006, 18h24
  4. Réponses: 3
    Dernier message: 05/03/2006, 23h38
  5. [Requête] Problème INSERT INTO
    Par lerico dans le forum Requêtes et SQL.
    Réponses: 22
    Dernier message: 10/01/2006, 17h12

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