UPDATE mysql dans une boucle: alternative? - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : UPDATE mysql dans une boucle: alternative? (/showthread.php?tid=5919) |
UPDATE mysql dans une boucle: alternative? - php_addict - 16-01-2012 Bonjour malheureusement je n'ai pas d'autre choix me semble t il que de faire un UPDATE mysql dans une boucle foreach() et je me permet de vous demander si il y a une alternative possible... en effet une des actions du jeu nécessite de diminuer de X ressources sur plusieurs villages du joueur, exmpl: on doit diminuer de 1000 ressources: le village 1 en contient 300, on diminue celui ci de 300 le village 2 en contient 400, on diminue celui ci de 400 le village 3 en contient 1000, on diminue celui ci de 300 seulement y a t il une autre solution que de faire une boucle foreach()? j'aime pas trop les requetes SQL dans une boucle, c'est lent, même si elle est préparée... bonne journée ! RE: UPDATE mysql dans une boucle: alternative? - Myrina - 16-01-2012 Tu pourrais essayer de faire une procédure stockée en MySQL. Celle-ci pourrait effectuer ta boucle de la même manière que tu le ferais en php. Au minimum, tu gagneras en temps de connexion vu qu'il n'y aura qu'un seul accès à MySQL. (Je ne me souviens plus si les procédures stockées sont "compilées"). RE: UPDATE mysql dans une boucle: alternative? - php_addict - 16-01-2012 une procédure stockée est-elle plus rapide qu'une requête préparée? RE: UPDATE mysql dans une boucle: alternative? - Myrina - 16-01-2012 peut être pas mais elle sera forcement plus rapide pour itérer sur les villages avec l'update unitaire que la version php avec un update pour chaque village, que se soit une requête préparée ou pas RE: UPDATE mysql dans une boucle: alternative? - keke - 16-01-2012 Tu peux pas faire la somme globale, soustraire ta taxe, puis redispatcher équitablement village par village ? (parce que là, en terme d'équité, ton premier village perd tout (100%) alors que le dernier ne perd "que" 30% de ses ressources) kéké PS : édit ton message, tu as fais un copié collé ... et ce n'est que le village 1 qui est ponctionné ^^ Ca gache un peu la lecture. RE: UPDATE mysql dans une boucle: alternative? - niahoo - 16-01-2012 haha j'ai mis facilement 5 minutes à trouver de quel copié collé tu parles ! Comme quoi on anticipe certains trucs et on ne voit pas l'erreur. Je dirais qu'une procédure stockée est plus rapide car tu peux lui envoyer les variables de façon plus concise (joueur + somme globale), donc un seul appel. à part ça … Quand tu dis que la boucle c'est lent, sur quels chiffres te bases-tu ? RE: UPDATE mysql dans une boucle: alternative? - php_addict - 16-01-2012 (1er message édité ) (16-01-2012, 01:15 PM)niahoo a écrit : Quand tu dis que la boucle c'est lent, sur quels chiffres te bases-tu ? aucun, c'est histoire de limité les ressources de MySQL, car avec 20 villages, ca fait 1 SELECT des données des villages, 20 calculs des ressources disponibles, et 20 UPDATE des villages, c'est peu en réalité, et ces une action assez peu fréquente mais je trouvait idiot de faire 20 UPDATE dans une boucle... je vais suivre vos conseils quant à la repartition encore merci RE: UPDATE mysql dans une boucle: alternative? - Ter Rowan - 16-01-2012 si tu fais une répartition proportionnelle au stock de chacun, tu peux y arriver avec une seule requête, à l'arrondi prêt : stock = stock * (1- (1000/1700)) pour les trois villages maintenant est ce que ça vaut le coup par rapport à la boucle ? J'en suis pas sûr. Au moins tu as une donnée propre et individualisée avec un update par village. RE: UPDATE mysql dans une boucle: alternative? - php_addict - 16-01-2012 j'avais pensé à l'arrondi mais ce n'est pas valable car si l'arrondi est de 600 et que le village n'a que 300 ca ne va pas du tout... RE: UPDATE mysql dans une boucle: alternative? - nicodd - 16-01-2012 Pourquoi ce n'est pas valable ? Ca me semble de loin la meilleure solution. Au pire les écarts seront d'une unité par village, mais bon de toute façon si tu ne travaille qu'avec des entiers, tu auras souvent ce type de problèmes, notamment pour une actualisation en semi-temps réel des ressources. |