Réunir 8 requetes sql en une seule


sff
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 336
Inscription: 2 Fév 2005

Réunir 8 requetes sql en une seule

Message le Sam Nov 01, 2008 18:02

Bonjours, j'ai une page qui utilise beaucoup trop de ressources sql.

En effet j'ai 8 requêtes, qui d'après ce qu'on m'a dit, peuvent être réuni en une seule.

Mais je n'arrive pas à faire avec des jonctions.
Quelqu'un peut t'il me renseigner?

Merci


Code: Tout sélectionner
   //Récupération élément décors.
   $mapquery = doquery("SELECT longitude, latitude, pic, land FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "map");
   
   while ($maprow = mysql_fetch_assoc($mapquery)) {   
      
      if (empty($TabMAP1[$maprow['longitude']][$maprow['latitude']]))
      $TabMAP1[$maprow['longitude']][$maprow['latitude']] = $maprow['pic'];

   }   
   mysql_free_result($mapquery);
   
   
   //Récupération élément clans.
   $clanquery = doquery("SELECT pic, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "clans_elements");
   
   while ($clanrow = mysql_fetch_assoc($clanquery)) {
      
      if (empty($TabMAP7[$clanrow['longitude']][$clanrow['latitude']]))
      $TabMAP7[$clanrow['longitude']][$clanrow['latitude']] = $clanrow['pic'];
   }
   mysql_free_result($clanquery);
   
   
   //Récupération élément villes.
   $townquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "towns");
   
   while ($townrow = mysql_fetch_assoc($townquery)) {
      
      if (empty($TabMAP2[$townrow['longitude']][$townrow['latitude']]))
      $TabMAP2[$townrow['longitude']][$townrow['latitude']] = $townrow['name'];
   }
   mysql_free_result($townquery);
   
   
   //Récupération élément points de téléportations.
   $teleportationquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "teleportations");
   
   while ($teleportationrow = mysql_fetch_assoc($teleportationquery)) {
      
      if (empty($TabMAP9[$teleportationrow['longitude']][$teleportationrow['latitude']]))
      $TabMAP9[$teleportationrow['longitude']][$teleportationrow['latitude']] = $teleportationrow['name'];
   }
   mysql_free_result($teleportationquery);
   
   
   //Récupération élément bureaux des colis.
   $officequery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "packages_offices");
   
   while ($officerow = mysql_fetch_assoc($officequery)) {
      
      if (empty($TabMAP8[$officerow['longitude']][$officerow['latitude']]))
      $TabMAP8[$officerow['longitude']][$officerow['latitude']] = $officerow['name'];
   }
   mysql_free_result($officequery);
   
   
   //Récupération élément coffres.
   $cofferquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "coffers");
   
   while ($cofferrow = mysql_fetch_assoc($cofferquery)) {
      
      if (empty($TabMAP5[$cofferrow['longitude']][$cofferrow['latitude']]))
      $TabMAP5[$cofferrow['longitude']][$cofferrow['latitude']] = $cofferrow['name'];
   }
   mysql_free_result($cofferquery);
   
   
   //Récupération élément arènes.
   $arenaquery = doquery("SELECT name, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end ORDER BY longitude DESC,latitude DESC LIMIT 48", "arenas");
   
   while ($arenarow = mysql_fetch_assoc($arenaquery)) {
      
      if (empty($TabMAP6[$arenarow['longitude']][$arenarow['latitude']]))
      $TabMAP6[$arenarow['longitude']][$arenarow['latitude']] = $arenarow['name'];
   }
   mysql_free_result($arenaquery);
   
   
   //Recupération des autres joueurs
   $playersquery = doquery("SELECT id, charname, avatar, longitude, latitude FROM {{table}} WHERE longitude between $x_start and $x_end AND latitude between $y_start and $y_end AND id!='$userrow[id]' AND UNIX_TIMESTAMP(onlinetime) >= '".(time()-120)."' AND (currentaction='En exploration' OR currentaction='En combat') ORDER BY longitude DESC,latitude DESC LIMIT 48", "users");

   while ($playersrow = mysql_fetch_assoc($playersquery)) {
      if (empty($TabMAP3[$playersrow['longitude']][$playersrow['latitude']]))
      $TabMAP3[$playersrow['longitude']][$playersrow['latitude']] = $playersrow['avatar'];
      $TabMAP4[$playersrow['longitude']][$playersrow['latitude']] = $playersrow['charname'];

   }
   mysql_free_result($playersquery);

Rod la Kox
WRInaute accro
WRInaute accro
 
Messages: 3253
Inscription: 24 Juin 2008

Message le Sam Nov 01, 2008 18:53

Pourquoi ne demandes tu pas à celui qui te l'a dit ?

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2678
Inscription: 13 Fév 2004

Message le Dim Nov 02, 2008 2:13


passion
WRInaute accro
WRInaute accro
 
Messages: 3107
Inscription: 6 Jan 2006

Message le Dim Nov 02, 2008 11:42

olaaa ce genre de requête doit consommer un max de ressources !

Une idée comme ça, dites-moi si je me trompe mais ... pourquoi ne pas se diriger vers la création d'une table virtuelle qui aura pour vocation de récupérer tous tes éléments?

AVANTAGE :
1 porte d'entrée = 1 seule requête sql sur cette table virtuelle = 1 porte de sortie

RESULTAT : Gain des ressources + accélération des traitements sql + risque minimiser des erreurs de traitements internes sql

PS : en lui mettant une procédure stockée pour la mise à jour quotidienne de tes données ou via une tâche cron...

Je suis dans le faux?


Malaiac
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 357
Inscription: 4 Mai 2005

Message le Dim Nov 02, 2008 21:15

@sff :
copie colle ici le code SQL de tes tables (create table...)
precise ce que tu veux comme resultat en sortie
en dehors de ca, difficile de t'aider !


Bool
WRInaute passionné
WRInaute passionné
 
Messages: 1290
Inscription: 26 Fév 2004

Message le Lun Nov 03, 2008 3:08

Bonsoir,

à moins de jouer avec des tables MERGE et/ou d'y aller à coup d'UNION/UNION ALL, difficile de tout regrouper. Mais le gain ne sera pas folichon non plus je pense.

Dans tous les cas ce genre de requête n'a pas de raison d'être "hyper consommateur" dès lors que tu ais un index double sur longitude + latitude (dans cet ordre, à cause de tes order by). Non ?


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités