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.
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.
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;![]()
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;
Cette requete met la somme du champ1 de ta table1 dans toutes les lignes de ta table2 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 UPDATE table2 SET champ1 = SELECT SUM(champ1) FROM table1;
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
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![]()
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
C'est tout à fait ca
Voici mes tables :
Ca en fait du 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
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;
Je voudrais calculer la somme de interventions.tps_prev pour la mettre dans contrats.tps_prev_total
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
Non, il faut que ce soit automatique ( voir plus haut) Apparement il faut utiliser un trigger, mais je n'arrive pas à m'en sortir
![]()
Qu'est-ce que tu n'arrives pas à faire dans ton Trigger ?
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
Voici un essai de trigger
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.
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;
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 :
ced
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
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
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.
Ben justement non, on ne peut pas appeler de procédure stockée pour l'instant avec les trigger MySQL...
cedLe 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.
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
In MySQL 5.1, you can write triggers containing direct references to tables by name![]()
Dommage qu'on ne puisse pas faire de trigger dans ce cas.
Merci pour la requête, elle marche nikel.![]()
Partager