Juste un petit exemple comme ça utilisant les tables temporaires.
Je suppose une table organisée comme suit
Table Village
Colonne JID - ID du joueur
Colonne VID - ID du Village
Colonne Res - Quantité de ressource
Lorsque des ressources sont prélevées, elle le sont comme dans l'exemple, dans l'ordre des ID de village.
On commence par enlever les ressources demandées du village 1.
S'il reste des ressources à prendre, on va chercher dans le village 2 et ainsi de suite.
L'idée est d'utiliser une combinaison de sous-requête et de table temporaire pour faire le boulot.
Je suppose ici que l'on veuille retirer 1000 ressources pour le joueur 1
Je fais donc un UPDATE sur la table principale.
J'effectue une jointure sur une table temporaire TmpRes, construite à la volée.
Dans cette table temporaire, j'utilise une sous-requête pour calculer le nouveau montant de ressource pour chaque village (NewRes).
Le passage via une table temporaire est nécessaire car MySQL interdit l'auto référencement direct d'une table via une sous requête lors d'un update.
Au final, tous les villages du joueur sont mis à jour en un seul passage.
[Edit]
Petite simplification de la requête
Je suppose une table organisée comme suit
Table Village
Colonne JID - ID du joueur
Colonne VID - ID du Village
Colonne Res - Quantité de ressource
Lorsque des ressources sont prélevées, elle le sont comme dans l'exemple, dans l'ordre des ID de village.
On commence par enlever les ressources demandées du village 1.
S'il reste des ressources à prendre, on va chercher dans le village 2 et ainsi de suite.
L'idée est d'utiliser une combinaison de sous-requête et de table temporaire pour faire le boulot.
Je suppose ici que l'on veuille retirer 1000 ressources pour le joueur 1
UPDATE Village
INNER JOIN (
SELECT
JID,
ID,
GREATEST(Res - GREATEST(1000-(
SELECT IFNULL(SUM(Res),0)
FROM Village V2
WHERE V2.ID < V1.ID),0),0) as NewRes
FROM Village V1
WHERE JID=1) TmpRes
ON
Village.JID = TmpRes.JID AND
Village.ID = TmpRes.ID
SET Village.Res = TmpRes.NewRes;
Je fais donc un UPDATE sur la table principale.
J'effectue une jointure sur une table temporaire TmpRes, construite à la volée.
Dans cette table temporaire, j'utilise une sous-requête pour calculer le nouveau montant de ressource pour chaque village (NewRes).
Le passage via une table temporaire est nécessaire car MySQL interdit l'auto référencement direct d'une table via une sous requête lors d'un update.
Au final, tous les villages du joueur sont mis à jour en un seul passage.
[Edit]
Petite simplification de la requête
Quand on te dit qu'un projet est terminé à 90%, prépare toi pour les 90% suivant
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC