JeuWeb - Crée ton jeu par navigateur
Requete jointure (plusieurs table, même champ) - 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 : Requete jointure (plusieurs table, même champ) (/showthread.php?tid=2270)

Pages : 1 2


Requete jointure (plusieurs table, même champ) - Kassak - 12-01-2008

'Soir! Je suis en train de m'énerver sur une requête..Je souhaite faire 3 requêtes jusqu'à maintenant faites séparément, en 1 seule.

Je m'explique, j'ai 3 tables : membre, PNJ et changement
Dans chaque table il y a les deux champs : posx et posy

Le but de la requête, on a une variable $x et $y, je souhaite récupérer le nombre d'entrée ou posx=$x ET posy=$y, pour les trois tables réunis.

Bref, ca n'a pas l'air bien compliqué comme ça, mais je n'arrive pas à faire marcher ma requête, rien ne se passe en faites, pas de messages d'erreur, mais si je l'enlève, ca revient au même!


(Petite précision, cela va servir a savoir si l'on peut pousser un joueur adverse, et si la case en face est libre : pas de joueur, de panneau, de PNJ )


Et voici ma requête, que j'ai tellement modifié, que je sais même plus ce qui va ou pas Confused :

Code PHP :
<?php 
$retour
= mysql_query('SELECT COUNT(*) AS nbre_entree FROM changement

LEFT JOIN membre ON changement.posx = membre.posx AND changement.posy = membre.posy

LEFT JOIN PNJ ON changement.posx = PNJ.posx AND changement.posy = PNJ.posy

WHERE changement.posx= "'
. $posx_adversaire . '" AND changement.posy = "' . $posy_adversaire.'"');
$donnees = mysql_fetch_array($retour)or die (mysql_error());


Merci de m'éclaircir sur comment faire ceci, d'une maniçre efficace!


RE: Requete jointure (plusieurs table, même champ) - uriak - 12-01-2008

J'ai testé cette requête sur des tables équivalentes et j'obtiens le résultat attendu à savoir avec select count le nb d'entrées et select les entrées correspondantes. Bref tu devrais vérifier le nom de tes tables et champs mais la méthodologie est bonne... quand tu dis qu'il ne se passe rien, ça te renvoie 0 dans nbre_entree ?

EDIT : en fait avec LEFT JOIN tu trouveras quelque chose changement même si tu ne trouves rien de correspondant dans membre ou pnj ? Est-ce ça que tu veux ? Ce ne serrait pas JOIN tout court à utiliser ?


RE: Requete jointure (plusieurs table, même champ) - Kassak - 12-01-2008

Quand il ne se passe rien, c'est que même si il y a un joueur sur la case, je pourrais quand même pousser l'autre joueur.
Donc, il ne récupère pas ce que je veux, ca marche chez toi?
Mes noms de tables et champs sont bon, pas de souci non plus de ce coté la!

Bref, bizarre tout ça...

Edit : JOIN ou LEFT JOIN c'est la même, rien ne se passe Confused


RE: Requete jointure (plusieurs table, même champ) - uriak - 12-01-2008

bref tu obtiens zero
tu es certain d'avoir 3 éléments de mêmes coordonnées dans tes tables ? coordonnées correspondant à tes variables ?

JOIN au lieu de LEFT JOIN permet d'éviter le cas ou il y a une entrée dans changement mais pas les autres. Mais de toute façon si tu en as zero au départ ça ne change rien Wink


RE: Requete jointure (plusieurs table, même champ) - Kassak - 12-01-2008

Oula, je crois que j'ai fait "une boule de merdasse" (Messiiiiiiire) !

Je viens de capter, que dans tous les cas possible, il ne pourra y avoir qu'une seule entrée sur les trois tables, car il n'y a qu'un pnj par case, qu'un joueur etc.....


Donc en faites normal que cela ne marche pas, car soit il y a une entrée dans une des 3 tables qui sera trouvée, soit cela vaudra 0!

Bref, et pour mettre ceci en requête maintenant?


RE: Requete jointure (plusieurs table, même champ) - uriak - 12-01-2008

c'est à dire ? Décris exactement le test que tu veux réaliser et la situation telle qu'elle se présente


RE: Requete jointure (plusieurs table, même champ) - Kassak - 12-01-2008

Alors j'ai une competence POUSSER dans le jeu, qui permet de faire reculer un joueur d'une case ( case directement en face, si je pousse du haut il ira en bas etc.....)

J'arrive a récupérer en $x et $y, la position qu'aura le joueur adverse une fois poussé, et donc, avec cette requête, je cherche si la case $x $y contient quelque chose!
Elle contient soit un joueur, soit un PNj, soit un panneau changement de map, soit rien du tout.
Si elle ne contient rien, soit le résultat = 0, le "poussage" est possible!


C'est mieux expliqué?


RE: Requete jointure (plusieurs table, même champ) - uriak - 12-01-2008

voilà la requête, attention les ALIAS sont nécessaires sous mysSQL

Code :
SELECT SUM(total) FROM
(
SELECT COUNT(*) total FROM changement WHERE changement.posx=".$x.'" AND changement.posy=".$y.' "
UNION ALL
SELECT COUNT(*) total FROM PNJ WHERE PNJ.posx=".$x.' " AND PNJ.posy=".$y.' "
UNION ALL
SELECT COUNT(*) total FROM membre WHERE membre.posx=".$x.' " AND membre.posy=".$y.' "
) AS entities

le AS final permet à mysql de donner un alias à cette table intermédiaire, sinon il râle (merci sephi-chan) Les Union ALL permettent d'éviter que des résultats identiques s'écrasent dans entities (pas grave pour toi mais pour avoir dans l'absolu la vraie somme il le faut)


RE: Requete jointure (plusieurs table, même champ) - uriak - 12-01-2008

Sachant que l'interface php SQL prend du temps, pourquoi donc, si ce n'est pour plus de flexibilité dans le traitement ? Mais on est d'accord que t1+t2+t3 est trivial à faire côté php ^^


RE: Requete jointure (plusieurs table, même champ) - Kassak - 12-01-2008

Merci bien Uriak, j'avais faire un truc de semblable, mais sans les UNION ALL etc...Je test ca des que je le peux, je n'ai pas le temps pour le moment Wink

Citation :Posté par oxman - Hier 08:06 PM
Pour un cas de ce genre je ne recommande pas de faire une requête, mais bien 3 requêtes.

Et je prefere largement faire ceci en 1 requête, car il va y avoir deja d'autre table a verifier par la suite, et cette requete va etre présente plusieurs fois dans la page, donc ca m'eviteras d'avoir 500 requete sur une meme pageWink