JeuWeb - Crée ton jeu par navigateur
Join 3 tables - 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 : Join 3 tables (/showthread.php?tid=3024)



Join 3 tables - jldbaro - 07-09-2008

Bonjour,

J'essaye de joindre 3 tables dans une requete sql:

1) Joueur
2) Ressource
3) Batiment.

Car un joueur peut acheter une mine d'or donc je diminue la ressource_prod.Electricite de 80, Ressource.or -3000 et Batiment.mine =+1

J'ai pas de prob pour faire une jointure de 2 tables mais de 3 j'arrive pas. Quelqu'un à une idée?

Merci

Requete:

UPDATE batiment
INNER JOIN ressource_joueur ON batiment.Id = ressource_joueur.Id,
INNER JOIN joueur ON batiment.Id = joueur.Id,
INNER JOIN ressource_prod ON batiment.Id = ressource_prod.Id SET joueur.Terrain =0,
Mine_or =2,
ressource_prod.Electricite = -80,
ressource_joueur.Or =9964625 WHERE batiment.Id =43


RE: Join 3 tables - Anthor - 07-09-2008

Pas d'alias au champs Mine_or ?


RE: Join 3 tables - Argorate - 08-09-2008

Tu peux esseyer de faire des "vrai" jointure: tableX.id = tableY.id AND tableX.id = tableZ.id ...


RE: Join 3 tables - Shakkah - 08-09-2008

jldbaro a écrit :UPDATE batiment
INNER JOIN ressource_joueur ON batiment.Id = ressource_joueur.Id,
INNER JOIN joueur ON batiment.Id = joueur.Id,
INNER JOIN ressource_prod ON batiment.Id = ressource_prod.Id SET joueur.Terrain =0,
Mine_or =2,
ressource_prod.Electricite = -80,
ressource_joueur.Or =9964625 WHERE batiment.Id =43

Tu as quoi comme message d'erreur quand tu essaye de faire cette requête ?

Pourquoi as tu mis des virgules après tes jointures ?

A part les virgules et l'alias de mine_or la requête me semble correcte
essaye celle là :
Code :
UPDATE batiment
INNER JOIN ressource_joueur ON batiment.Id = ressource_joueur.Id
INNER JOIN joueur ON batiment.Id = joueur.Id
INNER JOIN ressource_prod ON batiment.Id = ressource_prod.Id
SET joueur.Terrain = 0,
TABLE.Mine_or = 2,
ressource_prod.Electricite = -80,
ressource_joueur.Or = 9964625
WHERE batiment.Id = 43
TABLE est à remplacer par la bonne table ^_^.

Et si celle-là marche pas essaye (Trouver en cherchant sur le net ne faisant quasiment jamais de jointure dans un update, je ne peux pas te dire si ça fonctionne Source)
Code :
UPDATE batiment
SET joueur.Terrain = 0,TABLE.Mine_or = 2,ressource_prod.Electricite = -80,ressource_joueur.Or = 9964625 WHERE batiment.Id = 43
FROM batiment
INNER JOIN ressource_joueur ON batiment.Id = ressource_joueur.Id
INNER JOIN joueur ON batiment.Id = joueur.Id
INNER JOIN ressource_prod ON batiment.Id = ressource_prod.Id



RE: Join 3 tables - jldbaro - 08-09-2008

Je ne mets pas de virgule, je récupère le message d'erreur de mysql...

Tjs en erreur, et je ne comprends pas...

Code PHP :
<?php 
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 'FROM batiment INNER JOIN ressource_joueur ON batiment.Id = ressource_joueur.Id' at line 3 requete: UPDATE batiment SET joueur.Terrain = 0, batiment.Mine_or = 2, ressource_prod.Electricite = -80,ressource_joueur.Or = 9964625 WHERE batiment.Id = 43 FROM batiment INNER JOIN ressource_joueur ON batiment.Id = ressource_joueur.Id INNER JOIN joueur ON batiment.Id = joueur.Id INNER JOIN ressource_prod ON batiment.Id = ressource_prod.Id



RE: Join 3 tables - MdE - 08-09-2008

Je vais un peu taper à côté du sujet, mais il y a un truc que je trouve bizarre, tu veux faire perdre 3000 or à ton joueur et tu fais:

ressource_joueur.Or =9964625 ???

Mets plutôt cette syntaxe:
ressource_joueur.Or = resource_joueur.Or - 3000
Ca va te simplifier des trucs

Idem pour le reste:
Mine_or = Mine_or+1,
ressource_prod.Electricite = ressource_prod.Electricite - 80
Vraiment désolé pour le double post mais je viens de m'apercevoir d'une grosse erreur qui est sûrement la cause du problème:

Ne JAMAIS appeler l'un de ses champs "Or" car il y a des erreurs d'interprétations après avec le OU logique ! Donc faut le renommer gold ou PO, enfin, ce que tu veux !

Dans le même style, j'ai mis du temps à découvrir qu'il ne fallait pas utiliser le terme "Force" comme nom pour une donnée.


RE: Join 3 tables - Sephi-Chan - 08-09-2008

Or est un mot réservé par MySQL. Il faut juste encadrer le mot de backquotes pour pouvoir l'utiliser, ce qui donne `Or`.
Le cas se présente également pour le mot Force, par exemple. Smile Edit : J'avais pas vu que tu avais également cité le cas de Force.

Je t'invite donc à regarder dans la liste des mot réservé par MySQL quand tu crée un nouveau champ. Tu peux également encadrer systématiquement tous les noms de champs et d'alias dans ta requête par les backquotes `.


Sephi-Chan


RE: Join 3 tables - jldbaro - 08-09-2008

MdE a écrit :Je vais un peu taper à côté du sujet, mais il y a un truc que je trouve bizarre, tu veux faire perdre 3000 or à ton joueur et tu fais:

ressource_joueur.Or =9964625 ???

Mets plutôt cette syntaxe:
ressource_joueur.Or = resource_joueur.Or - 3000
Ca va te simplifier des trucs

Idem pour le reste:
Mine_or = Mine_or+1,
ressource_prod.Electricite = ressource_prod.Electricite - 80
Vraiment désolé pour le double post mais je viens de m'apercevoir d'une grosse erreur qui est sûrement la cause du problème:

Ne JAMAIS appeler l'un de ses champs "Or" car il y a des erreurs d'interprétations après avec le OU logique ! Donc faut le renommer gold ou PO, enfin, ce que tu veux !

Dans le même style, j'ai mis du temps à découvrir qu'il ne fallait pas utiliser le terme "Force" comme nom pour une donnée.


Car je récupère la requete SQL (via la page php) et non mon code initial.


RE: Join 3 tables - jldbaro - 08-09-2008

La requete correcte est la suivante ;-)

Merci quand même ;-)
Code PHP :
<?php 
UPDATE batiment
INNER JOIN joueur ON batiment
.Id = joueur.Id
INNER JOIN ressource_prod ON batiment
.Id = ressource_prod.Id
INNER JOIN ressource_joueur ON batiment
.Id = ressource_joueur.Id
SET batiment
.Mine_or = 2 , joueur.Terrain = 0 , ressource_prod.Electricite = -80 , ressource_joueur.Or= 9964625
WHERE batiment
.Id = 43

Sephi-Chan a écrit :Or est un mot réservé par MySQL. Il faut juste encadrer le mot de backquotes pour pouvoir l'utiliser, ce qui donne `Or`.
Le cas se présente également pour le mot Force, par exemple. Smile Edit : J'avais pas vu que tu avais également cité le cas de Force.

Je t'invite donc à regarder dans la liste des mot réservé par MySQL quand tu crée un nouveau champ. Tu peux également encadrer systématiquement tous les noms de champs et d'alias dans ta requête par les backquotes `.


Sephi-Chan