8800 sujets

Développement web côté serveur, CMS

Salut tout le monde,

Voilà ma situation. J'ai 3 tables :

pjsac, pjinventaire, objet

La première contient les informations du sac de mes personnages, elle a 2 champs qui nous intéresse:
ID qui est l'ID du personnage, qui est la primary key de la table
poids (qui est le poids actuellement transporté)

pjinventaire contient l'ensemble des objets possédés par un joueur. Elle a 3 champs :
IDpj qui est l'ID du joueur
IDobjet qui est l'ID de l'objet
quantité : le nombre d'objet transporté.

IDpj ET IDobjet forment la primary key.

Ce qui signifie qu'un même personnage sera répertorié sur plusieurs enregistrements dans cette table avec 1 enregistrement par personnage et par objet distinct.


objet contient l'ensemble des données concernant un objet. Elle a 2 champs qui nous intéressent :
ID qui est l'ID de l'objet
poids qui est le poids de l'objet.


On peut relier les tables ainsi :
pjinventaire.IDpj et pjsac.ID représente la même chose
pjinventaire.IDobjet et objet.ID représente la même chose.


Le problème que j'ai, c'est qu'il me faut recalculer la valeur du sac à dos pour TOUS mes personnages. (suite à une exploitation abusive de la part d'un joueur qui m'a fait planté mon poids)
Le poids du sac à dos se calcule en gros ainsi : somme(objet.poids*pjinventaire.quantite)... pour chaque pj bien sûr.


J'ai essayé une requête, mais elle donne pas franchement ce que je veux :
update pjsac set pjsac.poids=0;
update pjsac,pjinventaire,objet
set pjsac.poids=pjsac.poids+(objet.poids*pjinventaire.quantite)
where pjinventaire.IDpj= pjsac.ID AND pjinventaire.IDobjet =objet.ID;


A l'heure actuelle, elle ne parcourt pas toute la table pjinventaire, mais uniquement le premier enregistrement de chaque personnage. (du moins c'est ce que j'interprète des résultats) Smiley confus

Donc voilà, si quelqu'un a une idée pour régler ce soucis.
Modifié par Lothindil (27 Sep 2011 - 12:14)
Bonjour,

MySQL n'est pas fait pour faire ce genre de calculs. Il te permet de faire la requête qui parcourt la table pjinventaire, mais pas le calcul. Pour celui ci, il faut utiliser un autre langage adapté.
Modifié par annso (26 Sep 2011 - 08:56)
annso a écrit :
Bonjour,

MySQL n'est pas fait pour faire ce genre de calculs. Il te permet de faire la requête qui parcourt la table pjinventaire, mais pas le calcul. Pour celui ci, il faut utiliser un autre langage adapté.


C'est malheureux de croire que MySQL n'est fait que pour stocker et récupérer des données... Le SQL est un langage puissant qui si il est bien maîtrisé peut faire gagner beaucoup de temps en développement et en performances à l'exécution.

Quoi qu'il en soit Lothindil pourrais-tu tester cette requête? Je pense que ça pourra te faire avancer.

UPDATE pjsac s, (SELECT i.IDpj, SUM(o.poids*i.quantite) as poidstotal
		 FROM objet o 
		   JOIN pjinventaire i 
		     ON o.ID = i.IDobjet
      		 GROUP BY i.IDpj) AS agg
SET s.poids = agg.poidstotal
WHERE s.ID = agg.IDpj
skywalk3r a écrit :


C'est malheureux de croire que MySQL n'est fait que pour stocker et récupérer des données... Le SQL est un langage puissant qui si il est bien maîtrisé peut faire gagner beaucoup de temps en développement et en performances à l'exécution.


J'ai longuement hésité avant de poster ma réponse. Je savais en effet MySQL capable de faire ce genre de calculs, mais je ne savais pas que c'était plus performant - on m'a plutôt préconisé le contraire, de les éviter...

Désolé de la fausse information donc Smiley confused
skywalk3r a écrit :


C'est malheureux de croire que MySQL n'est fait que pour stocker et récupérer des données... Le SQL est un langage puissant qui si il est bien maîtrisé peut faire gagner beaucoup de temps en développement et en performances à l'exécution.

Quoi qu'il en soit Lothindil pourrais-tu tester cette requête? Je pense que ça pourra te faire avancer.

UPDATE pjsac s, (SELECT i.IDpj, SUM(o.poids*i.quantite) as poidstotal
		 FROM objet o 
		   JOIN pjinventaire i 
		     ON o.ID = i.IDobjet
      		 GROUP BY i.IDpj) AS agg
SET s.poids = agg.poidstotal
WHERE s.ID = agg.IDpj
Ouahhh, les alias sur les tables, je connaissais pas ^^
Et j'ignorais qu'il y avait moyen de faire un select dans un update comme ça.

Bref, ça marche nickel, un grand merci ! Smiley lol
Smiley lol