Bonjour tout le monde,
Je suis bloqué sur un problème apparemment tout simple mais très bloquant. Je dois faire des UPDATE joint multiple.
Je travaille sur un jeu de stratégie en ligne. Chaque village possède une forge qui emploie des groupes de forgerons. Toutes les heures, la "santé" de la forge est diminué du nombre de forgeron travaillant à la forge.
Imaginons que j'ai deux groupes de forgerons - A et B composés respectivement de 10 et 5 travailleurs - et une forge F - d'une santé de 100.
Je voudrais par conséquent faire une requête qui sélectionne chaque couple forgerons-forge (soit F-A et F-B) et modifie en fonction la santé de la forge, ce qui doit donner :
J'ai par conséquent codé la requête suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // santé de départ = 100; santé -= 10; // moins le nombre de forgeron A, soit santé = 100 - 10 = 90; santé -= 5; // moins le nombre de forgeron B, soit santé = 90 - 5 = 85; // santé final = 85.
Malheureusement, cela ne fonctionne pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 UPDATE Batiment b INNER JOIN Habitant h ON h.Village_Id = b.Village_Id SET b.Sante = b.Sante - h.Travail WHERE b.Nom = "Forge" && h.Metier = "Forgeron"
Santé est invariablement égal à 90.
Je vois deux possibilités :
1/ soit la requête ne modifie qu'une seule fois la valeur santé
2/ soit la requête sélectionne d'abord la valeur santé de chaque couple forge-forgeron, et modifie ensuite la santé en partant de la valeur originale. La deuxième modification ne prend ainsi pas en compte la première.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 // santé de départ = 100; santé -= 10; // moins le nombre de forgeron A, soit santé = 100 - 10 = 90; // n'exécute pas la deuxième modification, soit santé final = 90.
Petite remarque : la deuxième solution implique que le couple F-B soit traité AVANT le couple F-A, car c'est le résultat de F-A qui est enregistré. Or, si l'on modifie cette requête en SELECT :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // santé de départ = 100; santé -= 5; // moins le nombre de forgeron B, soit santé = 100 - 5 = 85; santé -= 10; // moins le nombre de forgeron A, soit santé = 100 - 10 = 90; // santé final = 90.
le couple F-A apparaît avant le couple F-B. Cela me pousse à penser que la première solution est peut-être la bonne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM Batiment b INNER JOIN Habitant h ON h.Village_Id = b.Village_Id WHERE b.Nom = "Forge" && h.Metier = "Forgeron"';
Avez-vous une idée comment régler cela, car ce type de requête se retrouve dans tous mes crons et, si je ne veux pas tuer mon processeur, je ne peux vraiment pas me permettre de faire à chaque fois un SELECT puis un UPDATE à chaque enregistrement retourné.
Merci d'avance pour vos réponses, ou au moins d'avoir pris le temps de lire ce message.
Korbn
Partager