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



Jointures? - Byleth - 26-06-2007

Voilà, j'ai fait ça récemment :

Code PHP :
<?php 
$requete
=mysql_query('SELECT marchable,Pseudo,Nom FROM decors,rat,pnj WHERE (decors.Pos_x='.$dirx.' AND decors.Pos_y='.$diry.') OR (rat.Pos_x='.$dirx.' AND rat.Pos_y='.$diry.') OR (pnj.Pos_x='.$dirx.' AND pnj.Pos_y='.$diry.')') or die(mysql_error());

$cause=mysql_fetch_assoc($requete);

$erreurdecors=$cause['marchable'];
$erreurjoueur=$cause['Pseudo'];
$erreurpnj=$cause['Nom'];

if(empty(
$cause)){$testdeplacement='true';}
if(isset(
$erreurdecors)){echo $erreurdecors;}
if(isset(
$erreurjoueur)){echo $erreurjoueur;}
if(isset(
$erreurpnj)){echo $erreurpnj;}

if (isset(
$testdeplacement)){echo 'ok';}
}

L'intérêt c'était d'aller chercher dans 3 tables différentes ce qu'il pouvait y avoir sur une case (selon une coordonnée donc) afin de me dire si oui ou non la case était déjà occupé.

ça marche à peu près jusqu'à ce que je rentre dans les détails ou je m'embrouille. Tant qu'il s'agit de savoir si la case est vide ou non, je réussissais comme je le voulais, mais là, il s'agit de savoir par quoi la cause est occupé (un individu ou un obstacle). Mais là, ça ne marche plus du tout. J'ai essayé, comme vous le voyez d'afficher mes variables et là, je découvre qu'il s'agit tout le temps des mêmes, quelque soit ma position et quelque soit le joueur.

Je voulais donc savoir si ce que je voulais faire était réalisable et si oui comment...

Merci d'avance...


RE: Jointures? - NicoMSEvent - 26-06-2007

je te conseille de revoir le schéma de tes tables.

Un rat ne peut etre que sur une case, et il sera toujours sur une seule case (pas de rats perdu sur zero case) : met un id_case dans ta table rat.

Par la suite, fait quelque chose du genre :
Code :
SELECT case.*,rat.* FROM case LEFT JOIN rat ON case.id_case=rat.id_case
Le left join te sert a montrer toutes les cases, et éventuellement si il y a un rat dessus.

En meme temps, ça empeche un rat d'avoir des coordonnées d'une case qui n'existe pas.

Pourrais tu avoir plusieurs obstacles sur une meme case?


RE: Jointures? - Byleth - 26-06-2007

Je comprends pas trop, mais je crois que tu dis que j'ai dans mes tables chaque case réferencée. Ce n'est pas le cas, je n'ai pas toute les cases par défauts. J'ai un terrain par défaut qui s'affiche s'il n'y a rien dessus, ce qui réduit énormément le nombre de cases.

Si j'ai mal compris, je veux bien que tu détails.

Il ne peut y avoir plusieurs obstacles sur une case, mais éventuellement un PNJ sur un obstacle, même si ça ne me parait pas utile...


RE: Jointures? - NicoMSEvent - 26-06-2007

Code :
SELECT marchable,Pseudo,Nom
FROM decors,rat,pnj
WHERE (decors.Pos_x='.$dirx.' AND decors.Pos_y='.$diry.')
OR (rat.Pos_x='.$dirx.' AND rat.Pos_y='.$diry.')
OR (pnj.Pos_x='.$dirx.' AND pnj.Pos_y='.$diry.')
Le fait d'avoir mis des OR va faire en sorte qu'il va te combiner
1)tous les rats et les PNJ pour la case se trouvant en X et Y
2)toutes les cases et tous les PNJ pour le rat se trouvant en X et Y
3)toutes les cases et tous les rats pour le pnj se trouvant en X et Y

le mieux qu'il y a faire dans ton cas est de faire 3 requetes séparées.


RE: Jointures? - Byleth - 26-06-2007

Arg, ok, je reviens à 0. MDR

Ok, je m'étais dit que faire ça me réduirait le nombre de requêtes et ferait donc gagner du temps.

J'ai tellement l'impression de coder comme un bourrin (faute de connaissances aussi, il faut bien l'avouer) que je m'étais mis dans la tête que je ferais un truc poussé ^^.

Bon, bah à moins que quelqu'un est une solution miracle pour ce que je veux faire (pourtant, c'est juste une phrase en français..) je retourne à mes 3 requêtes...

Merci du conseil