Réunir 8 requetes sql en une seule

  • Auteur de la discussion Auteur de la discussion sff
  • Date de début Date de début
WRInaute impliqué
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:
	//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);
 
WRInaute accro
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?
 
WRInaute occasionnel
@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 !
 
WRInaute passionné
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 ?
 
Discussions similaires
Haut