JeuWeb - Crée ton jeu par navigateur
[Réglé] Simplification de requêtes SQL - 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 : [Réglé] Simplification de requêtes SQL (/showthread.php?tid=1536)



[Réglé] Simplification de requêtes SQL - Joojo - 30-07-2007

Bonjour à tous, après deux semaines de vacances, je me suis remit à programmer. Grâce à votre aide pour la map, tout commence à se débloquer.

Je suis en train de regarder un peu tous mes scripts pour essayer de les optimiser, sauf qu'il y en a une qui permet d'afficher les joueurs de la map qui m'enbête.
Pour vous rappeller j'ai une table map_membre qui contient l'id du membre, son login et le numéro de la case ou il se situe.

Ce que doit faire cette requête pas c'est afficher tous les joueurs qui ont le même numéro de case que la personne connecté.

Voilà mon script qui fonctionne à peu prés:
Code PHP :
<?php 
// Affichage des autres joueurs étant sur la même case
$affichage_joueurs = mysql_query('SELECT id_case FROM map_membre WHERE login_membre = "'. $_COOKIE['pseudo'] .'"') or die(mysql_error());
$r_affichage_joueurs = mysql_fetch_array($affichage_joueurs);
$affichage_j = $r_affichage_joueurs['id_case'];

$affichage_joueurs_1 = mysql_query('SELECT id_membre, login_membre FROM map_membre WHERE id_case = "'. $affichage_j .'"') or die(mysql_error());
while(
$r_affichages_joueurs_1 = mysql_fetch_array($affichage_joueurs_1))
{
echo
$r_affichages_joueurs_1['login_membre'].'<br /><a href="attaque.php?id='.$r_affichages_joueurs_1['id_membre'] .'"/>Attaquer</a><br />';
}
J'ai dit à peu prés car il affiche tous les joueurs qui sont sur la case. Donc en voit son pseudo sur la carte et on peut s'attaquer etc....De plus il y a deux requêtes SQL juste pour ça.

Alors je pensais qu'une requête de ce genre pourrait faire l'affaire:
Code PHP :
<?php 
$test
= mysql_query('SELECT id_membre, login_membre FROM map_membre WHERE id_case = id_case OF "'. $_COOKIE['pseudo'] .'"');
C'est à dire qu'elle selectionnera toutes les personnes dont leur id_case serais égalle à l'id_case du joueur. Mais je n'arrive à pas dire "ou id_case est égal à l'id_case du joueur".

Autre sujet:
Pour mon système de pa, pm je comptai utiliser du java qui s'enclencherait toutes les x heures. Cette page serait dans l'administration pour que personne ne puisse toucher au "chronométre". Bonne idée ou pas?

Merci. [/php]


RE: Simplification de requêtes SQL - Roworll - 30-07-2007

Une petite jointure avec un alias devrait faire l'affaire.
Code PHP :
<?php 
$rsJ
=mysql_query('SELECT M2.id_membre, M2.login_membre FROM map_membre as M1
INNER JOIN map_membre as M2 ON M1.id_case=M2.id_case
WHERE M1.login_membre="'
.$_COOKIE['pseudo'].'"');

Si dans ton résultat tu veux exclure le joueur, tu peux faire
Code PHP :
<?php 
$rsJ
=mysql_query('SELECT M2.id_membre, M2.login_membre FROM map_membre as M1
INNER JOIN map_membre as M2 ON M1.id_case=M2.id_case AND M1.login_membre<>"'
.$_COOKIE['pseudo'].'"
WHERE M1.login_membre="'
.$_COOKIE['pseudo'].'"');



RE: Simplification de requêtes SQL - Nessper - 30-07-2007

mmh je pense qu'il n'y a pas besoin de jointure, comme ça ça devrait marcher :
Code PHP :
<?php 
$test
= mysql_query('SELECT id_membre, login_membre FROM map_membre WHERE id_case IN (SELECT id_case FROM map_membre WHERE pseudo="'.$_COOKIE['pseudo'].'"');



RE: Simplification de requêtes SQL - Roworll - 30-07-2007

Les requêtes imbriquées ne fonctionnent pas dans toutes les versions de MySQL.
C'est pourquoi j'en suis resté à une version plus compatible.


RE: Simplification de requêtes SQL - Nessper - 30-07-2007

ah ok j'étais pas au courant. A partir de quelle version elles marchent ?


RE: Simplification de requêtes SQL - Roworll - 30-07-2007

4.1 je crois.
Mon hébergeur courant étant en 4.0, j'ai encore les vieux réflexes.


RE: Simplification de requêtes SQL - Wells - 30-07-2007

Normalement (je dit bien normalement), tout les nouveaux hébergement que vous trouverez à l'heure actuelle sont en mysql 5.

Donc les requêtes imbriqués (bien plus puissantes) ne poseront pas de soucis.


RE: Simplification de requêtes SQL - Joojo - 31-07-2007

J'ai encore appris un truc: les requêtes imbriquées.

Roworll c'est un peu compliqué pour moi tes requêtes, je comprend pas tout.

Nessper ta requête fonctionne en ajoutant une parenteise pour fermer la deuxième requête. Mais comment dire à PHP de ne pas afficher le joueur sur lequel il se base pour afficher les autres?


RE: Simplification de requêtes SQL - Nessper - 31-07-2007

Code PHP :
<?php 
$test
= mysql_query('SELECT id_membre, login_membre FROM map_membre WHERE id_case IN (SELECT id_case FROM map_membre WHERE pseudo="'.$_COOKIE['pseudo'].'") AND pseudo != "'.$_COOKIE['pseudo'].'"');

Et voilà, logiquement ça devrait retourner tout le monde sauf toi


RE: Simplification de requêtes SQL - Joojo - 31-07-2007

C'est aussi bête que ça.....j'aurai pu y penser....:toilette:

Merci à tous. Smile