Auteur Sujet: 2 Table, 1 Upgrad  (Lu 1027 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne jppj

  • Habitué
  • **
  • Messages: 168
    • Holonet-System
2 Table, 1 Upgrad
« le: 02 janvier 2006 à 22:48:49 »
Salut tout le monde,

Voilà, j'ai un tit problème, et je ne sais pas trop comment m'en dépatouiller,

J'ai deux tables : (je ne donne que les champs utiles ici)
-> j_joueur
> id
> credit

-> j_planete
> id_joueur
> rev

Mon but : faire la somme des enregistrements du champ "rev" où id_joueur de la table j_planete est égale à l'id du joueur de la table j_joueur. Et cette somme l'ajouter à credit. (de l'id joueur en cours).

J'avais pensé à faire la requête :
$sql = "UPDATE j_joueur, j_planete SET j_joueur.credit = j_joueur.credit + j_planete.SUM(rev) WHERE j_planete.id_joueur = j_joueur.id";
$result=mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

Ce qui m'a donné un petit :
Citer
Erreur SQL !
UPDATE j_joueur, j_planete SET j_joueur.credit = j_joueur.credit + j_planete.SUM(rev) WHERE j_planete.id_joueur = j_joueur.id
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(rev) WHERE j_planete.id_joueur = j_joueur.id' at line 1

Ou encore j'ai aussi tenté avec une autre écriture :
$sql = "UPDATE j_joueur, j_planete SET j_joueur.credit = j_joueur.credit + SUM(j_planete.rev) WHERE j_planete.id_joueur = j_joueur.id";
$result=mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

Ce qui m'a valu le petit message :
Citer
Erreur SQL !
UPDATE j_joueur, j_planete SET j_joueur.credit = j_joueur.credit + SUM(j_planete.rev) WHERE j_planete.id_joueur = j_joueur.id
Invalid use of group function

Après quelques recherches j'en suis venu que la fonction sum() ne fonctionnait pas avec un UPGRAD mais juste en SELECT.


Après je peux toujours faire quelque chose du genre :
requete pour récupérer l'id du joueur
while
{
requete de la somme des revenus (rev) des planètes
requete d'update du credit
}

Mais franchement je ne pense que ca soit une très bonne idée, même si c'est une requete qui ne se lancera qu'une seule fois par semaine pour en gros une soixantaine d'ID.

Quelqu'un a une idée ?  :(  

Hors ligne Ice

  • VIP
  • *****
  • Messages: 2 403
    • ATFX
2 Table, 1 Upgrad
« Réponse #1 le: 03 janvier 2006 à 08:35:28 »
A mon avis, tu es obligé de passer par 2 requetes !
1 pour récupérer la somme avec un select
et 1 pour l'update

Hors ligne bman

  • Débutant
  • *
  • Messages: 19
    • http://demarrage.bienvenuchezouam/
2 Table, 1 Upgrad
« Réponse #2 le: 03 janvier 2006 à 10:11:50 »
tout dépend de la version de mysql que tu utilises, mais, dans tout les cas, pour une soixantaine d'enregistrements, tu auras plus  vite fait d'écrire une page php qui te fasse les deux requêtes...

Sinon, si ta version demysql le supporte, tu dois pouvoir utiliser les subselect, avec une requête du type
UPDATE matable SET monchamps=monchamps+(SELECT SUM(champs2) FROM table 2 WHERE 1 GROUP BY champs1)
mais celà n'est supporté que par les toutes dernières versions...

Autrement, il te faut passer par une table intermédiaire :
DROP TABLE IF EXISTS tmp_joueur;
CREATE TABLE tmp_joueur
SELECT id_joueur, SUM(rev) as rev_sum from j_planete GROUP BY id_joueur;
UPDATE j_joueur j JOIN tmp_joueur t ON t.id_joueur=j.id
SET j.credit=j.credit+t.rev_sum;

Hors ligne jppj

  • Habitué
  • **
  • Messages: 168
    • Holonet-System
2 Table, 1 Upgrad
« Réponse #3 le: 03 janvier 2006 à 22:52:15 »
Là je n'ai pas trop le temps de tester ca mais dés que je l'ai je vous fais signe.

EDIT
Voilà j'ai essayé ta requête sous toutes ses coutures bman et ca n'a rien donné...

Pour ma version de MySQL c'est celle qui est sur le cluster2, je ne voudrais pas me tromper mais je crois que c'est la MySQL 3.23.32.

Je vais plutot favoriser la solution deux requêtes que la table temporaire, normallement ca ne devrait pas me poser de problèmes mais je vous fais signe au cas ou.
« Modifié: 07 janvier 2006 à 10:33:30 par jppj »

Hors ligne jppj

  • Habitué
  • **
  • Messages: 168
    • Holonet-System
2 Table, 1 Upgrad
« Réponse #4 le: 07 janvier 2006 à 10:57:41 »
Voilà en deux requêtes ca me donne ca :

// On fait la somme des revenus et on ajoute à credit.
$sql1="SELECT id_joueur, SUM(rev) as somme FROM j_planete GROUP BY id_joueur";
$req1=mysql_query($sql1) or die('Erreur SQL1 !<br>'.$sql1.'<br>'.mysql_error());
while($val1 = mysql_fetch_assoc($req1))
    {
$ijoueur=$val1['id_joueur'];
$newcredit=$val1['somme'];
$sql = "UPDATE j_joueur SET credit = credit + $newcredit WHERE id = $ijoueur";
$result=mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    }

Ah moins que vous ayez mieux à me proposer...

EDIT
Oops, sorry, je voulais éditer l'autre message mais je n'ai pas fait attention...
 
« Modifié: 07 janvier 2006 à 10:58:28 par jppj »