Réduire le nombre de requêtes sql

WRInaute impliqué
Bonjour, je pose cette question ici parce que je ne sais vraiment plus quoi faire. C'est un problème qui traine depuis plus de 6 mois et personne n'a vraiment réussi à m'aider, moi même je n'y arrive pas.

Le but est pour simple, il faudrait réduire le nombre de requêtes dans le code ci-dessous car il y en a beaucoup trop.

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);

Sinon il y a la fonction doquery pour ceux qui veulent plus de précisions :
Code:
function doquery($query, $table) {
	include('config.php');
	$sqlquery = mysql_query(str_replace("{{table}}", $dbsettings["prefix"] . "_" . $table, $query)) or die(mysql_error());
	return $sqlquery;
}

La page complète est dispo ici : http://www.rpgillusion.net/game/map.txt

Voila si quelqu'un si pouvait m'aider, je lui serais vraiment reconnaissant.
 
WRInaute accro
Encore une fois, cette question ne se serait pas posée si tu avais pris le temps d'analyser le projet et la structure des tables à utiliser.

Quand tu programmes un truc, faut avoir en permanence à l'esprit qu'il faut éviter les doublons et être le plus générique possibles. C'est quasiment que des copiés collés dans ton cas donc ça se voit qu'il y a un problème non ?

2 tables auraient suffit: ELEMENTS et TYPES pour faire tout ça en une seule requête avec une jointure. Là on peut rien faire désolé. Et rafistoler un truc qui ne tient pas debout ça n'a pas de sens :/
 
WRInaute impliqué
suite

YoyoS je comprends ta réflexion et je serais totalement d'accords si chaque table comprenait 3 ou 4 champs sql maximum, ca aurait été plus simple de tout combiner, mais la chaque table contient entre 10 et 20 champs chacune, ca devient impossible à combiner.
 
WRInaute accro
Donc il n'y a pas moyen de faire moins de requêtes alors. Peut-être faire un tableau (array) avec les noms des tables et boucler dessus en faisant la même requête, mais ça ne change rien au nombre de requêtes. C'est pas normal que tes tables fassent 20 colonnes. Je veux bien te faire une analyse vite fait si tu me fais une description complète de toute ta base, tes tables et tes champs actuels :)
 
WRInaute impliqué
suite

Je peux te montrer la structure de quelques tables :

map :

`id` smallint(5) unsigned NOT NULL auto_increment,
`pic` tinyint(3) unsigned NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`latitude` smallint(6) NOT NULL default '0',
`open` tinyint(3) unsigned NOT NULL default '1',
`land` tinyint(3) unsigned NOT NULL default '1',

towns :

`id` tinyint(3) unsigned NOT NULL auto_increment,
`name` varchar(30) NOT NULL default '',
`latitude` smallint(6) NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`innprice` tinyint(4) NOT NULL default '0',
`parchmentprice` tinyint(3) NOT NULL default '0',
`parchmentcoffers` tinyint(3) NOT NULL default '0',
`total_buy` int(11) NOT NULL default '0',
`travelpoints` smallint(5) unsigned NOT NULL default '0',
`equipslist` text NOT NULL,
`itemslist` text NOT NULL,
`hidden` tinyint(3) NOT NULL default '0',
`coords_map1`varchar(50) NOT NULL default '',
`coords_map2`varchar(50) NOT NULL default '',
`coords_map3`varchar(50) NOT NULL default '',
`coords_map4`varchar(50) NOT NULL default '',
`coords_map5`varchar(50) NOT NULL default '',
`coords_map6`varchar(50) NOT NULL default '',

package offices :

`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(30) NOT NULL default '',
`latitude` smallint(6) NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`travelpoints` int(11) NOT NULL default '0',
`parchmentprice` int(11) NOT NULL default '0',

clans elements :

`id` tinyint(3) unsigned NOT NULL auto_increment,
`latitude` smallint(6) NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`clan` int(11) NOT NULL default '0',
`pic` varchar(30) NOT NULL default '',
`type` smallint(6) NOT NULL default '0',

coffers :

`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(30) NOT NULL default '',
`latitude` smallint(6) NOT NULL default '0',
`longitude` smallint(6) NOT NULL default '0',
`parchmentprice` int(11) NOT NULL default '0',
`total_buy` int(11) NOT NULL default '0',
`travelpoints` int(11) NOT NULL default '0',
`total` int(11) NOT NULL default '0',
`limit_d` int(11) NOT NULL default '0',
`total_d` int(11) NOT NULL default '0',
`total_r` int(11) NOT NULL default '0',


Mais je doute que tu sois avancé avec ca.
 
WRInaute accro
En effet c'est pas assez, c'est surtout intéressant de voir la ou les données sont souvent dupliquées pour optimiser correctement :)
 
Discussions similaires
Haut