Salut à tous, je bloque depuis un bon moment sur une requête d'insertion assez complexe.
Mon objectif est de faire une mutation automatique des enseignants.
Chaque enseignant a un emploi, une discipline et sa structure actuelle.
Ce dernier désire être muté selon 3 vœux (les structures d'accueils). voir la table agent_structure ci-dessous
Nous avons en outre une table Etat_besoin
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 CREATE TABLE IF NOT EXISTS `agent_structure` ( `id_agent` int(11) NOT NULL, `id_str` int(11) NOT NULL, `id_emploi` int(11) NOT NULL, `id_discipline` int(11) NOT NULL, `voeu_1` int(11) NOT NULL, `voeu_2` int(11) NOT NULL, `voeu_3` int(11) NOT NULL, PRIMARY KEY (`id_agent`,`id_str`,`id_emploi`,`id_discipline`), UNIQUE KEY `id_agent` (`id_agent`), KEY `id_structure` (`id_str`), KEY `discipline_agent` (`id_discipline`), KEY `emploi_agent` (`id_emploi`), KEY `voeu1_agent` (`voeu_1`), KEY `voeu2_agent` (`voeu_2`), KEY `voeu3_agent` (`voeu_3`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Le mécanisme de la requête est de vérifier si le ratio(colonne de la table Etat_besoin) du voeu_1 de l'agent est inférieur à 0,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE TABLE IF NOT EXISTS `etat_besoin` ( `id_str` int(11) NOT NULL, `id_emploi` int(11) NOT NULL, `id_discipline` int(11) NOT NULL, `ratio` int(11) NOT NULL, PRIMARY KEY (`id_str`,`id_emploi`,`id_discipline`), KEY `emploi_id` (`id_emploi`), KEY `structure_id` (`id_str`) USING BTREE, KEY `discipline_etat` (`id_discipline`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
si oui alors on insère les données de cet agent dans la Table Mutation avec pour nouvelle structure voeu_1 et on incrémente ce ratio rattaché à la structure d'accueil tout en désincrémentant le ratio de la structure d'origine de l'agent,
sinon on passe au voeu_2, on vérifie ensuite son ratio afférant, si il est inférieur à 0 on l'insère dans la Table Mutation ... sinon on passe au voeu_3.
Ci_dessous ma requête d'approche qui ne marche pas comme je veux.
J'espère avoir été un peu clair dans la présentation de mon problème et merci de m'y aider.
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 INSERT INTO mutation (id_agent, id_emploi, id_discipline, id_str, ratio_actuel) SELECT a.id_agent, L.id_emploi, dis.id_discipline, E.id_str, E.ratio - COALESCE( D.nb_departs, 0 ) + COALESCE( A.nb_arrivees, 0 ) AS ratio_actuel FROM agent_structure astr INNER JOIN agent a ON a.id_agent = astr.id_agent INNER JOIN emploi L ON L.id_emploi = astr.id_emploi INNER JOIN discipline dis ON dis.id_discipline = astr.id_discipline INNER JOIN structure str ON str.id_str = astr.id_str INNER JOIN etat_besoin E LEFT JOIN ( -- Nombre arrivées par établissement SELECT M.id_str, M.id_emploi, M.id_discipline, COUNT(*) AS nb_arrivees FROM mutation M GROUP BY M.id_str, M.id_emploi, M.id_discipline ) A ON E.id_str = A.id_str AND E.id_emploi = A.id_emploi AND E.id_discipline = A.id_discipline LEFT JOIN ( // -- Nombre départs par établissement SELECT A.id_str, M.id_emploi, M.id_discipline, COUNT(*) AS nb_departs FROM mutation M INNER JOIN agent_structure A ON M.id_agent = A.id_agent GROUP BY M.id_str, M.id_emploi, M.id_discipline ) D ON E.id_str = D.id_str AND E.id_emploi = D.id_emploi AND E.id_discipline = D.id_discipline WHERE // -- Vérifions les 3 différents vux de chaque agent par rapport aux ratios des structures d'accueils CASE WHEN E.id_str = astr.voeu_1 AND E.id_emploi = L.id_emploi AND E.id_discipline = dis.id_discipline AND E.ratio < 0 THEN E.id_str = astr.voeu_1 AND E.ratio + 1 WHEN E.id_str = astr.voeu_2 AND E.id_emploi = L.id_emploi AND E.id_discipline = dis.id_discipline AND E.ratio < 0 AND E.id_str = astr.voeu_1 AND E.id_emploi = L.id_emploi AND E.id_discipline = dis.id_discipline AND E.ratio > 0 THEN E.id_str = astr.voeu_2 AND E.ratio + 1 WHEN E.id_str = astr.voeu_3 AND E.id_emploi = L.id_emploi AND E.id_discipline = dis.id_discipline AND E.ratio < 0 AND E.id_str = astr.voeu_1 AND E.id_emploi = L.id_emploi AND E.id_discipline = dis.id_discipline AND E.ratio > 0 AND E.id_str = astr.voeu_2 AND E.id_emploi = L.id_emploi AND E.id_discipline = dis.id_discipline AND E.ratio > 0 THEN E.id_str = astr.voeu_3 AND E.ratio + 1 ELSE 0 END
Partager