Réunir 8 requetes sql en une seule

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 289
Inscription: Mer Fév 02, 2005 23:04

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: 1812
Inscription: Mar Juin 24, 2008 15:03

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: 1196
Inscription: Ven Fév 13, 2004 20:33

Message le Dim Nov 02, 2008 2:13



passion
WRInaute accro
WRInaute accro
 
Messages: 2465
Inscription: Ven Jan 06, 2006 20:18

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 impliqué
WRInaute impliqué
 
Messages: 357
Inscription: Mer Mai 04, 2005 21:42

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 accro
WRInaute accro
 
Messages: 1290
Inscription: Jeu Fév 26, 2004 15:59

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 ?


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité