Page 1 sur 1

requete dynamique

Posté : 10 mai 2006, 11:04
par Invité
j'ai regardé sur ce topic mais dans cet exemple les tables sur laquelle la requete ets éfféctuée est toujour la même.

Voici mes requêtes
$sql ="SELECT * 
					FROM office o, office_sub_specialization os, sub_specialization s, specialization sp
					WHERE o.id_office=os.id_office
					AND sp.id_specialization =  s.id_specialization
					AND os.id_sub_specialization=s.id_sub_specialization 
					AND s.id_sub_specialization=".$sub_spec.";";		
					
					
if(isset($_POST['area']) && $_POST['area'] != -1 && $_POST['specialization'] >= 346 ){					
		$sql ="SELECT * 
				FROM office o, office_sub_specialization os, sub_specialization s, office_address oa, area a, specialization sp
				WHERE o.id_office=os.id_office 
				AND sp.id_specialization =  s.id_specialization
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND oa.id_area=a.id_area AND oa.id_office=o.id_office 
				AND s.id_sub_specialization=".$sub_spec." 
				AND a.id_area =".$area." ;";
}	
		
if($_POST['specialization'] >= 346 ){
		$sql ="SELECT * FROM office o, office_sub_specialization os, sub_specialization s, specialization sp
				WHERE o.id_office=os.id_office 
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND s.id_specialization=sp.id_specialization
				AND sp.id_specialization=".$spec;
}			
		
if(isset($_POST['area']) || $_POST['area'] != -1){					
		$sql ="SELECT * 
				FROM office o, office_sub_specialization os, sub_specialization s, office_address oa, area a, specialization sp
				WHERE o.id_office=os.id_office 
				AND sp.id_specialization =  s.id_specialization
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND oa.id_area=a.id_area AND oa.id_office=o.id_office 
				AND s.id_sub_specialization=".$sub_spec." 
				AND a.id_area =".$area." ;";
}

Posté : 10 mai 2006, 11:05
par zeus
Quel topic ? Quel est la question ?

Posté : 10 mai 2006, 11:05
par Invité

Posté : 10 mai 2006, 11:07
par Invité
et bien réaliser le meme type d'opération mais avec des requetes portant sur tables différentes

Posté : 10 mai 2006, 11:35
par gforce
bon je continue

dans les exemples que j'ai trouvés les requetes ne portent toutes que sur la même table:
$sub_spec = (isset($_POST["sub_specialization"])  && $_POST["sub_specialization"] != "tout") ? $_POST["sub_specialization"] : "";
$spec   = (isset($_POST["specialization"])) ? $_POST["specialization"]  : "";
$area  = (isset($_POST["area"])) ? $_POST["area"] : "";


			$requete= "SELECT * FROM la table WHERE 1=1 ";
			
			if (!empty($sub_spec))
					$requete .= " AND id_sub_specialization = '".$sub_spec."' ";
			
			if (!empty($spec))
					$requete .= " AND id_specialization = '".$spec."' ";
					
			if (!empty($area))
					$requete .= " AND id_area = '".$area."' ";
mais mes requetes sont sur plusieurs table comme ici:
$sql ="SELECT * 
					FROM office o, office_sub_specialization os, sub_specialization s, specialization sp
					WHERE o.id_office=os.id_office
					AND sp.id_specialization =  s.id_specialization
					AND os.id_sub_specialization=s.id_sub_specialization 
					AND s.id_sub_specialization=".$sub_spec.";";		
					
					
if(isset($_POST['area']) && $_POST['area'] != -1 && $_POST['specialization'] >= 346 ){					
		$sql ="SELECT * 
				FROM office o, office_sub_specialization os, sub_specialization s, office_address oa, area a, specialization sp
				WHERE o.id_office=os.id_office 
				AND sp.id_specialization =  s.id_specialization
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND oa.id_area=a.id_area AND oa.id_office=o.id_office 
				AND s.id_sub_specialization=".$sub_spec." 
				AND a.id_area =".$area." ;";
}	
		
if($_POST['specialization'] >= 346 ){
		$sql ="SELECT * FROM office o, office_sub_specialization os, sub_specialization s, specialization sp
				WHERE o.id_office=os.id_office 
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND s.id_specialization=sp.id_specialization
				AND sp.id_specialization=".$spec;
}			
		
if(isset($_POST['area']) || $_POST['area'] != -1){					
		$sql ="SELECT * 
				FROM office o, office_sub_specialization os, sub_specialization s, office_address oa, area a, specialization sp
				WHERE o.id_office=os.id_office 
				AND sp.id_specialization =  s.id_specialization
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND oa.id_area=a.id_area AND oa.id_office=o.id_office 
				AND s.id_sub_specialization=".$sub_spec." 
				AND a.id_area =".$area." ;";
}
j'aimerais savoir comment je pourrais rendre le choix de mes tables aussi dynamique?

Posté : 10 mai 2006, 15:29
par Invité
personne :(

Posté : 11 mai 2006, 08:56
par Invité
il y a beaucoups d'expert sur ce forum, j'aimerais juste savoir si je vais dans la bonne direction. Si vous avez une remarque ou l'autre n'hésiter pas.

Posté : 11 mai 2006, 11:26
par ouckileou
Je lis bien ton sujet mais j'ai du mal à voir où se situe le problème

Le topic que tu as cité, ce sont juste des petites astuces pour rajouter des conditions dynamiquement, en évitant une multitude de tests redondant.

A priori ça ne change si tes requêtes s'effectuent sur plusieurs tables.

Posté : 11 mai 2006, 11:51
par Invité
c'est pourtant simple, dans les exemples que cité on peut voir que c'est la clause WHERE qui est dynamique mais moi dans mon cas j'utilise des jointures et il faudrait que je puisse choisir directement le choix des tables dans le FROM. Il faudrait donc pour mon moteur de recherche en fonction du type de recherche éfféctuée joindre telle ou telle table. Je peux le faire comme je l'ai montré plus haut, oui certe cela fonctionne mais c'est parce que je n'ai que 4 combinaisons de recherche mais j'aimerais le faire de façon plus professionelle, que si maintenant j'avais 100 critères de recherche je puisse le faire sans problème avec la même requete.

Est ce plus claire?

Posté : 11 mai 2006, 12:05
par ouckileou
Et bien tu peux construire ta requête en plusieurs morceaux, par exemple :
$donnees = "SELECT col1, col2, col3";
$table = "FROM table1";
if ($condition == 'toto') {
   $jointures = " INNER JOIN table2 ON colA = colB";
} else {
   $jointures = " INNER JOIN table3 ON colA = colB";
}

if ($condition == "titi") {
   $filtrage = " WHERE colA = 'TRUC'";
}

$requete = $donnees.$table.$jointures.$filtrage;
Donc déjà ta place je sortirais tes jointures de ton WHERE, en utilisant JOIN, et en ne gardant donc dans le WHERE que ce qui relève du filtrage.

Ce sera a priori plus simple à gérer