JeuWeb - Crée ton jeu par navigateur
SQL: requete Update avec SELECT integré. - 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 : SQL: requete Update avec SELECT integré. (/showthread.php?tid=1492)

Pages : 1 2


SQL: requete Update avec SELECT integré. - corentone - 20-07-2007

Bonjour!
Voila j'ai differentes tables, et je veux faire un UPDATE

Voila ma requete:

Code :
UPDATE soiree,dj SET dj.xp_dj=dj.xp_dj+((SELECT SUM(objet.xp_objet) FROM soiree LEFT JOIN dj ON dj.id_dj=soiree.id_dj LEFT JOIN matos ON matos.id_dj=dj.id_dj LEFT JOIN objet ON objet.id_objet=matos.id_objet WHERE soiree.date_soiree="2007-07-19" GROUP BY dj.id_dj)*3*(soiree.reussite_soiree+50))/100 WHERE soiree.id_dj=dj.id_dj AND soiree.date_soiree='2007-07-19'

Le but étant d'augmenter l'xp du DJ. Lorsqu'elle est à part, la requete SELECT marche et donne bien une valeur numerique.

Par contre, voila mon erreur:
#1093 - You can't specify target table 'soiree' for update in FROM clause

Donc si quelqu'un peut m'aider...a bientot
Merci de tout coeur!
Corentone


RE: SQL: requete Update avec SELECT integré. - zigzog - 20-07-2007

Salut à toi,
Oula!
C'est le bazart la dedans...
Ce serait plus simple à comprendre si c'etait bien rangé.
Pourquoi tu ne fais tes calculs à part en creant des variables?

$requete=mysql_query("SELECT SUM(objet.xp_objet) FROM soiree LEFT JOIN dj ON dj.id_dj=soiree.id_dj LEFT JOIN matos ON matos.id_dj=dj.id_dj LEFT JOIN objet ON objet.id_objet=matos.id_objet WHERE soiree.date_soiree="2007-07-19" GROUP BY dj.id_dj")

$data=mysql_fetch_assoc($requete)

$var1=$data['objet.xp_objet']
$var2=$var1*3*($soiree.reussite_soiree+50)/100

UPDATE soiree,dj SET dj.xp_dj=$var2 WHERE soiree.id_dj=dj.id_dj AND soiree.date_soiree='2007-07-19'

Par contre je ne suis pas sur(pas verifié) que tes jointures étaient bonnes.

Je suis encore un noob donc c'est pas bon à 100%

Amicalement,ZigZog


RE: SQL: requete Update avec SELECT integré. - NicoMSEvent - 20-07-2007

tu ne peux pas mettre a jour une table contenue dans ton select.

par contre, essaye ceci :
Code :
UPDATE dj SET dj.xp_dj=dj.xp_dj+
(
SELECT SUM(objet.xp_objet*3*(soiree.reussite_soiree+50) )/100
FROM soiree
LEFT JOIN matos ON matos.id_dj=dj.id_dj
LEFT JOIN objet ON objet.id_objet=matos.id_objet
WHERE soiree.date_soiree="2007-07-19" AND soiree.id_dj=dj.id_dj
GROUP BY dj.id_dj
)

Je n'ai pas testé, je sais pas si ça va marcher ou pas... sinon, il ne reste "plus qu'a " adapter Wink

Edit : erf, j'ai encore été pris de vitesse ^^

Edit2 : autre truc que j'ai remarqué, tu mets a jour TOUS les DJ de ta DB, donc, tu ne devrais exécuter cette requete qu'une seule fois par jour (en fait, c'est assez économe comme système)


RE: SQL: requete Update avec SELECT integré. - corentone - 20-07-2007

Pas bete^^ c'est idiot je n'y avais pas pensé! je vais faire la resolution dans le select, et l'updater ensuite...quel boulet je suis^^

Par contre, oui l'interet de cette requete est de passer outre le PHP et de resoudre les evenements qu'avec une requete centralisée effectuée a une heure precise chaque jour

en fait non!

Ta requete est bien mais ne permet de pas d'updater seulemnt les Djs qui sont a la soirée Sad, il me faut obligatoirement la table soiree pour ce test...Sad donc ca ne marche pas :'(


RE: SQL: requete Update avec SELECT integré. - NicoMSEvent - 21-07-2007

la table soiree est dans le select... il me semble que tout y est... pourrais tu décrire plus précisément ce que tu attends de la requete, sans laisser une miette de zone d'ombre? ^^


RE: SQL: requete Update avec SELECT integré. - corentone - 21-07-2007

Oui, j'avoue que ma demande n'est pas tres claire Wink

je vais essayer de faire court Smile

Voici mes tables et les champs qui nous interessent.

Soiree: id_soiree, id_dj, date_soiree,reussite soirée.->repertorie les soirées.
DJ:id_dj, xp_dj->repertorie les differents djs et leur carac
matos, id_matos, id_dj, id_objet->repertorie tous les matos, individuellements
objet: id_objet, xp_objet->repertorie les caracteristik de chak matos

En fait, je veux ajouter au DJ l'XP: SUM(xp_objet)*3*(reussite_soiree+50)/100
Sachant que le DJ peut avoir jusqu"'a 6objets, d'ou la somme.

par contre, je ne veux updater que les DJs dont l'id_dj est dans la table soiree, et dont la date de la soiree, date_soiree, est egale a un jour precis.

D'ou mon ancienne requete, mais le probleme vient que je ne peux pas melanger update et select pour la meme table Sad

je ne sais pas si c'est plus clair pour vous que ma requete d'avant...mais je ne vois vraiment plus comment faire, je suis un peu bloqué la et ca membete Sad

Merci de votre (future) aide!


RE: SQL: requete Update avec SELECT integré. - NicoMSEvent - 21-07-2007

Code :
UPDATE dj SET dj.xp_dj=dj.xp_dj+
(
SELECT NVL(SUM(objet.xp_objet*3*(soiree.reussite_soiree+50) )/100,0)
FROM soiree
LEFT JOIN matos ON matos.id_dj=dj.id_dj
LEFT JOIN objet ON objet.id_objet=matos.id_objet
WHERE soiree.date_soiree="2007-07-19" AND soiree.id_dj=dj.id_dj
GROUP BY dj.id_dj
)
Reprenons le morceau de code...

Il va mettre à jour l'xp de tous les DJ.

Avec ce que je viens de rajouter comme morceau de code, la formule dans la requete ci dessus retourne 0 si le dj n'a pas participé a une soirée (donc en gros, xp_dj=xp_dj+0 => ça ne change rien).

Ceci ne convient toujours pas? Wink


RE: SQL: requete Update avec SELECT integré. - corentone - 22-07-2007

Code :
UPDATE dj SET dj.xp_dj=dj.xp_dj+(
SELECT CEIL(SUM(objet.xp_objet*3*(soiree.reussite_soiree+50) )/100)
FROM soiree
LEFT JOIN matos ON matos.id_dj=soiree.id_dj
LEFT JOIN objet ON objet.id_objet=matos.id_objet
WHERE soiree.date_soiree="2007-07-19" AND soiree.id_dj=dj.id_dj
GROUP BY dj.id_dj
)

Voila la requete que j'ai testé dans phpmyadmin Wink
J'ai remplacé le NVL par un CEIL car mysql ne reconnait pas NVL Smile

Par contre, vraiment etonnament, cela a marché pour le DJ qui etait bien concerné,cela lui a bien ajouté son XP,mais cela a mis les XP des autres à 0!!!! Cela n'a pas fait +0, mais une autre operation qui a tout mis a zero!!!
Je ne comprends pas vraiment, car la requete me semble bonne.

Vraiment Merci de ton aide NicomsEvent,j'espere que tu peux m'aider encore un petit peu Confused

EDIT: une structure en IF serait possible ou pas?

EDIT2: Voila la derniere MAJ que j'ai faite de la requete, elle a par contre modifiée TOUTES les XP, memes celles qui ne devaient pas etre modifiées! lol!
Code :
UPDATE dj SET dj.xp_dj=dj.xp_dj+(
SELECT CEIL(SUM(objet.xp_objet)*3*(soiree.reussite_soiree+50)/100 )
FROM soiree
LEFT JOIN matos ON matos.id_dj = soiree.id_dj
LEFT JOIN objet ON objet.id_objet = matos.id_objet
WHERE soiree.date_soiree = '2007-07-19'
GROUP BY dj.id_dj
)



RE: SQL: requete Update avec SELECT integré. - NicoMSEvent - 22-07-2007

CEIL n'est pas la bonne fonction a employer. Le but de la manoeuvre était de remplacer la valeur NULL par 0.. je viens de (re)trouver la fonction equivalente à NVL pour Oracle, c'est IFNULL pour MySQL.
Donc, remplace NVL (ou CEIL) par IFNULL, ça devrait marcher.

Code :
UPDATE dj SET dj.xp_dj=dj.xp_dj+(
SELECT IFNULL(SUM(objet.xp_objet*3*(soiree.reussite_soiree+50) )/100 ,0)
FROM soiree
LEFT JOIN matos ON matos.id_dj=soiree.id_dj
LEFT JOIN objet ON objet.id_objet=matos.id_objet
WHERE soiree.date_soiree="2007-07-19" AND soiree.id_dj=dj.id_dj
GROUP BY dj.id_dj
)

IFNULL(a,b) => si a est null, ça remplace par b...


RE: SQL: requete Update avec SELECT integré. - corentone - 22-07-2007

Cette requete a remplacée les xp des DJ qui ne sont pas concernées par zero! alors que celui concerné a bien été modifié comme l'on veut!

je ne comprends vraiment pas!

Pourquoi mysql ne reprend-t-il pas cette ancienne valeur pour lui ajouter zero mais remplace-t-il tout par zero?