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

SQL Procédural MySQL Discussion :

formule dans mysql


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éclairé Avatar de tibotibo69
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 268
    Par défaut formule dans mysql
    Bonjour,

    j'aimerais savoir s'il est possible de faire la somme du champ1 de la table1 pour la mettre dans le champ1 de la table2 ?

    Tout ça sans passer par php, seulement en restant dans mysql, un peu à la manière des formules dans un tableau excel.

  2. #2
    Membre chevronné Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Par défaut
    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE VIEW table2
    AS
    SELECT SUM(champ1) as champ2
    FROM table1;

  3. #3
    Membre éclairé Avatar de tibotibo69
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 268
    Par défaut
    Je n'ai pas bien tout compris à ta requête, on m'a dit d'utiliser des triggers, mais j'ai des erreurs de syntaxe que je n'arrive pas à corriger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TRIGGER somme_inters
    AFTER INSERT ON interventions
    IF old.contrats.tps_prev_total <> new.contrats.tps_prev_total THEN
    UPDATE contrats SET contrats.tps_prev_alloue = (SELECT SUM(interventions.tps_prev)
    FROM interventions
    INNER JOIN dossiers ON dossiers.id_dossier = interventions.id_dossier
    WHERE dossiers.id_contrat = (SELECT DISTINCT id_contrat FROM contrats))
    END IF;

  4. #4
    Membre chevronné Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE table2
    SET champ1 = SELECT SUM(champ1) FROM table1;
    Cette requete met la somme du champ1 de ta table1 dans toutes les lignes de ta table2 !

  5. #5
    Membre éclairé Avatar de tibotibo69
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 268
    Par défaut
    Le problème c'est qu'il faudrait que la somme et l'insertion dans champ1 de la table2 se calcule automatiquement à chaque ajout d'un enregistrement dans la table1

  6. #6
    Membre chevronné Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Par défaut
    montre nous la structure de tes deux tables


    en fait mon code te fait créer une vue! une vue c'est une table virtuelle, issue d'une requête de sélection.

    donc montre moi tes deux tables et je te créerais la vue correspondante à la somme que tu souhaite

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 067
    Par défaut
    Sauf que là, ce que tu souhaites, c'est une mise à jour automatique dès qu'on touche à la table1.
    Donc, c'est bien un trigger qui fait ça.

    De toute façon, pour qu'on puisse t'aider, à ce niveau-là, il nous faut le schéma des deux tables .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Membre éclairé Avatar de tibotibo69
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 268
    Par défaut
    C'est tout à fait ca

    Voici mes tables :

    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
     
    DROP TABLE IF EXISTS `interventions`;
    CREATE TABLE `interventions` (
      `id_intervention` int(10) NOT NULL auto_increment,
      `id_dossier` smallint(6) NOT NULL default '0',
      `id_categorie` tinyint(2) NOT NULL default '0',
      `id_nature` tinyint(2) NOT NULL default '0',
      `id_employe` tinyint(3) NOT NULL default '0',
      `creation` datetime NOT NULL default '0000-00-00 00:00:00',
      `date_prevue` datetime NOT NULL default '0000-00-00 00:00:00',
      `debut` datetime NOT NULL default '0000-00-00 00:00:00',
      `fin` datetime NOT NULL default '0000-00-00 00:00:00',
      `tps_prev` int(6) NOT NULL default '0',
      `tps_cur` int(6) NOT NULL default '0',
      `tps_dep` int(6) NOT NULL default '0',
      `description` text NOT NULL,
      `cloture` binary(1) NOT NULL default '1',
      PRIMARY KEY  (`id_intervention`),
      KEY `id_dossier` (`id_dossier`),
      KEY `id_employe` (`id_employe`),
      KEY `id_categorie` (`id_categorie`),
      KEY `id_nature` (`id_nature`),
      CONSTRAINT `interventions_ibfk_11` FOREIGN KEY (`id_employe`) REFERENCES `employes` (`id_employe`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `interventions_ibfk_10` FOREIGN KEY (`id_nature`) REFERENCES `inter_natures` (`id_nature`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `interventions_ibfk_8` FOREIGN KEY (`id_dossier`) REFERENCES `dossiers` (`id_dossier`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `interventions_ibfk_9` FOREIGN KEY (`id_categorie`) REFERENCES `inter_categories` (`id_categorie`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
     
     
    DROP TABLE IF EXISTS `dossiers`;
    CREATE TABLE `dossiers` (
      `id_dossier` smallint(6) NOT NULL auto_increment,
      `id_client` smallint(5) NOT NULL default '0',
      `id_contrat` int(10) default NULL,
      `nom_client` varchar(128) NOT NULL default '',
      `id_reception` tinyint(3) default NULL COMMENT 'id_employe',
      `id_source` tinyint(2) NOT NULL default '0',
      `id_travail` tinyint(2) NOT NULL default '0',
      `id_urgence` tinyint(2) NOT NULL default '0',
      `id_severite` tinyint(1) NOT NULL default '0',
      `id_responsable` tinyint(3) default NULL COMMENT 'id_employe',
      `commentaires` mediumtext NOT NULL,
      `debut` datetime NOT NULL default '0000-00-00 00:00:00',
      `fin` datetime NOT NULL default '0000-00-00 00:00:00',
      `id_etat` tinyint(2) NOT NULL default '1',
      `cloture` binary(1) NOT NULL default '0',
      PRIMARY KEY  (`id_dossier`),
      KEY `id_client` (`id_client`),
      KEY `reception` (`id_reception`),
      KEY `id_source` (`id_source`),
      KEY `id_travail` (`id_travail`),
      KEY `id_severite` (`id_severite`),
      KEY `charge` (`id_responsable`),
      KEY `id_etat` (`id_etat`),
      KEY `id_urgence` (`id_urgence`),
      KEY `nom_client` (`nom_client`),
      KEY `id_contrat` (`id_contrat`),
      CONSTRAINT `dossiers_ibfk_107` FOREIGN KEY (`id_etat`) REFERENCES `dossier_etats` (`id_etat`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dossiers_ibfk_100` FOREIGN KEY (`nom_client`) REFERENCES `clients` (`nom_client`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dossiers_ibfk_101` FOREIGN KEY (`id_reception`) REFERENCES `employes` (`id_employe`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dossiers_ibfk_102` FOREIGN KEY (`id_source`) REFERENCES `dossier_sources` (`id_source`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dossiers_ibfk_103` FOREIGN KEY (`id_travail`) REFERENCES `dossier_travaux` (`id_travail`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dossiers_ibfk_104` FOREIGN KEY (`id_urgence`) REFERENCES `dossier_urgences` (`id_urgence`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dossiers_ibfk_105` FOREIGN KEY (`id_severite`) REFERENCES `dossier_severites` (`id_severite`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dossiers_ibfk_106` FOREIGN KEY (`id_responsable`) REFERENCES `employes` (`id_employe`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dossiers_ibfk_98` FOREIGN KEY (`id_client`) REFERENCES `clients` (`id_client`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `dossiers_ibfk_99` FOREIGN KEY (`id_contrat`) REFERENCES `contrats` (`id_contrat`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
     
     
    DROP TABLE IF EXISTS `contrats`;
    CREATE TABLE `contrats` (
      `id_contrat` int(10) NOT NULL auto_increment,
      `num_contrat` varchar(10) NOT NULL default '0',
      `id_client` smallint(5) NOT NULL default '0',
      `nom_client` varchar(128) default NULL,
      `id_type_contrat` tinyint(2) NOT NULL default '0',
      `debut` date NOT NULL default '0000-00-00',
      `fin` date NOT NULL default '0000-00-00',
      `tarif` decimal(10,2) NOT NULL default '0.00',
      `tps_prev_alloue` int(5) NOT NULL default '0',
      `tps_cur_alloue` int(5) NOT NULL default '0',
      `tps_backup` int(11) NOT NULL default '0',
      `tps_prev_total` int(5) NOT NULL default '0',
      `tps_cur_total` int(5) NOT NULL default '0',
      `creation` date NOT NULL default '0000-00-00',
      `clot` binary(1) NOT NULL default '0',
      PRIMARY KEY  (`id_contrat`),
      KEY `id_type_contrat` (`id_type_contrat`),
      KEY `id_client` (`id_client`),
      KEY `nom_client` (`nom_client`),
      CONSTRAINT `contrats_ibfk_14` FOREIGN KEY (`id_type_contrat`) REFERENCES `types_contrat` (`id_type_contrat`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `contrats_ibfk_12` FOREIGN KEY (`id_client`) REFERENCES `clients` (`id_client`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `contrats_ibfk_13` FOREIGN KEY (`nom_client`) REFERENCES `clients` (`nom_client`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Ca en fait du code !!

    Je voudrais calculer la somme de interventions.tps_prev pour la mettre dans contrats.tps_prev_total

  9. #9
    Membre éclairé Avatar de tibotibo69
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 268
    Par défaut
    Quelqu'un peut m'aider ?

  10. #10
    Membre chevronné
    Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2004
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 352
    Par défaut
    C'est une requête de ce genre-là (à retoucher après) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE contrats
    SET tps_prev_total = (SELECT SUM(tps_prev) FROM interventions)
    WHERE id_contrat = 10994

  11. #11
    Membre éclairé Avatar de tibotibo69
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 268
    Par défaut
    Non, il faut que ce soit automatique ( voir plus haut) Apparement il faut utiliser un trigger, mais je n'arrive pas à m'en sortir

  12. #12
    Membre chevronné
    Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2004
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 352
    Par défaut
    Qu'est-ce que tu n'arrives pas à faire dans ton Trigger ?

  13. #13
    Membre éclairé Avatar de tibotibo69
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 268
    Par défaut
    Je ne suis pas un professionnel du trigger, je n'arrive pas à créer un trigger qui corresponde à ce que je veux.

    C'est à dire :

    Calculer la somme des champs1 de la table1 pour mettre le résultat dans champ1 de la table2

    ou dans mon cas

    calculer la somme des interventions d'un contrat pour mettre le résultat dans la table contrats

  14. #14
    Membre éclairé Avatar de tibotibo69
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 268
    Par défaut
    Voici un essai de trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TRIGGER somme_inters
    AFTER INSERT ON interventions
    UPDATE contrats SET contrats.tps_prev_alloue = (SELECT SUM(interventions.tps_prev)
    FROM interventions
    INNER JOIN dossiers ON dossiers.id_dossier = interventions.id_dossier 
    WHERE dossiers.id_contrat = ??????);
    END;
    Dans ma base, chaque intervention est reliée à un dossier qui est lui même relié à un contrat ( voir plus haut pour le détail des tables), je voudrais calculer la somme du temps passé sur la totalité des interventions pour chaque contrat.

  15. #15
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 067
    Par défaut
    En regardant un peu la doc de MySQL sur les triggers (que je n'ai pas testés sous MySQL), j'ai lu qu'on ne pouvait pas y nommer les tables (pour l'instant). Donc, je ne crois que tu puisses le faire comme çà...
    J'ai fait un test et je ramasse une erreur en LOCK TABLE quand j'essaie de faire une insertion... Or, on ne peut pas faire de LOCK dans un trigger...
    Bref, il faut passer par l'application pour faire cette mise à jour.

    Voilà quand même une requête pour la mise à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    update contrats c
    inner join dossiers d on c.id_contrat = d.id_contrat
    inner join
      (select sum(i.tps_prev) as tps, c.id_contrat
       from interventions i
       inner join dossiers d on i.id_dossier = d.id_dossier
       inner join contrats c on d.id_contrat = c.id_contrat
       group by c.id_contrat) as t on t.id_contrat = c.id_contrat
    set c.tps_prev_total = t.tps
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  16. #16
    Membre chevronné
    Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2004
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 352
    Par défaut
    Sinon avec le Trigger, on peut toujours faire appel à une procédure stockée. Je ne sais pas si des tables vont subir le lock en même temps.

  17. #17
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 067
    Par défaut
    Ben justement non, on ne peut pas appeler de procédure stockée pour l'instant avec les trigger MySQL...
    Le déclencheur ne peut pas exécuter de procédures avec la commande CALL. Cela signifie que vous ne pouvez pas contourner le problèmes des noms de tables en appelant une procédure stockée qui utilise les noms de tables.
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  18. #18
    Membre chevronné Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Par défaut
    In MySQL 5.1, you can write triggers containing direct references to tables by name

  19. #19
    Membre éclairé Avatar de tibotibo69
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 268
    Par défaut
    Dommage qu'on ne puisse pas faire de trigger dans ce cas.

    Merci pour la requête, elle marche nikel.

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

Discussions similaires

  1. Recherche FULL Text existe que dans MySql ?
    Par seb.49 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 01/06/2004, 23h30
  2. foreign key dans mysql
    Par guillevin dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 08/04/2004, 16h07
  3. stockage d'images dans Mysql
    Par sessime dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/02/2004, 17h08
  4. Importer une db existante dans mysql
    Par Arbisis dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 19/02/2004, 18h02
  5. [D7-EXCEL2000] Formule dans cellule Excel qui ne se calcule pas
    Par Albertolino dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/09/2003, 15h18

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