Page 1 sur 1

Requetes imbriquées

Posté : 15 févr. 2008, 17:20
par béka
Bonjour, tout le monde, je suis obligé de faire des requetes imbriquées afin de trouver quelles sont les personnes qui sont rattachées à un batiments sachant que je ne peux modifier les structures de mes tables.

De ce fait, j'ai fait une requetes comme ci-dessous :

Code : Tout sélectionner

SELECT personnes.coord_gps_perso FROM equipes, fonctions, batiments_pere, personnes WHERE personnes.id = (SELECT id_personne FROM fonctions WHERE fonctions.id_equipe = (SELECT id FROM equipes WHERE equipes.id_batiment = (SELECT id FROM batiments_pere WHERE batiments_pere.id =11 ) ) )
Mais ceci ne marche pas, je ne comprends pas mon erreur.

En fait, je dois récupérer les coordonnées gps des personnes dont les id = au champ"id_personne" de la table "fonctions" lorsque l'"id_equipe" de la table "fonction" = "id" de la table "equipes" lorsque l'"id_batiment" de la table "fonction" = "id" de la table "batiments_pere" lorsque que "id de "batiments_pere" = $_GET["id_batiment"].

Voyez, c'est assez complexe.

Merci pour votre aide

Voici une de mes tables :

Code : Tout sélectionner

CREATE TABLE `equipes` ( `id` int(10) NOT NULL auto_increment, `nom` text NOT NULL, `id_service` int(10) NOT NULL default '0', `id_batiment` int(10) NOT NULL default '0', `id_equipe_sup` int(10) NOT NULL default '0', `equipe_fax` text NOT NULL, `position` int(11) NOT NULL default '99999', PRIMARY KEY (`id`) )

Posté : 15 févr. 2008, 18:52
par Truc
Déjà pas évident de s'y retrouver puisque tu parles de plusieurs tables mais nous en montre qu'une :?

Avec des jointure ça donnerait

Code : Tout sélectionner

SELECT p.coord_gps_perso FROM personnes p JOIN fonctions f ON p.id = f.id_personne JOIN equipes e ON f.id_equipe = e.id JOIN batiments_pre b ON f.id_batiment = b.id WHERE b.id = $_GET["id_batiment"]

Posté : 18 févr. 2008, 17:10
par béka
Non pas tout à fait car le champs id_batiment n'existe pas dans la table batiment_pere . Désolé pour le retard de réponse. Mais je vois un petit peu comment faire et je vais essayer de creuser pour voir


[EDIT] : en fait il doit y avoir un problème. Car j'utilise ce script json.php pour afficher des informations sur une carte google en fonction d'une requete SQL. (http://www.touraineverte.com/Google-Map ... /index.php)


Voici donc ma requete
$query = "SELECT p.coord_gps_perso, p.nom, p.prenom ";
$query .= "FROM personnes p ";
$query .= "JOIN fonctions f ON p.id = f.id_personne ";
$query .= "JOIN equipes e ON f.id_equipe = e.id ";
$query .= "JOIN batiments_pere b ON e.id_batiment = b.id ";
$query .= "WHERE b.id = '".$_GET['id_batiment']."'";
Mais avec cette requete et le script javascript donné dans l'exemple, rien ne s'affiche dans ma carte alors qu'il existe biend es enregistrements. En revanche lorsque j'utilise un requete plus simple (comme 'select * from personnes') sans jointure, ça marche.

Pouvez-vous m'aider.

Posté : 19 févr. 2008, 14:41
par Berzemus
$query = "SELECT p.coord_gps_perso, p.nom, p.prenom ";
$query .= "FROM personnes p ";
$query .= "JOIN fonctions f ON p.id = f.id_personne ";
$query .= "JOIN equipes e ON f.id_equipe = e.id ";
$query .= "JOIN batiments_pere b ON e.id_batiment = b.id ";
$query .= "WHERE b.id = '".$_GET['id_batiment']."'"; 
De ce que je me souviens, MySQL ne supporte pas l'alias d'une table sans le "AS".

Code : Tout sélectionner

personnes p

ne marche pas, il faut

Code : Tout sélectionner

personnes as p

Re: Requetes imbriquées

Posté : 19 févr. 2008, 14:59
par Hubert Roksor
je ne comprends pas mon erreur
Et moi je la vois pas, c'est grave ?

Posté : 19 févr. 2008, 15:04
par béka
ne marche toujours pas avec le AS.
Seulement voilà, lorsque je fais j'affiche le résultat de ma requête, j'ai bien les résultats que je m'attend à avoir.

Voici mon fichier json.php
<?php
/* chemin vers fichier connexion.php */
include("../utile/connexion.php");

connexion();

$query = "SELECT p.coord_gps_perso, p.nom, p.prenom ";
$query .= "FROM personnes AS p ";
$query .= "JOIN fonctions AS f ON p.id = f.id_personne ";
$query .= "JOIN equipes AS e ON f.id_equipe = e.id ";
$query .= "JOIN batiments_pere AS b ON e.id_batiment = b.id ";
$query .= "WHERE b.id = '".$_GET['id_batiment']."'";

//$query = "SELECT * FROM personnes";

$result = mysql_query($query);
if (!$result) {die("Requète invalide. Erreur : " . mysql_error());}


$json = array("[");
$tab = "\t{";
while ($row = @mysql_fetch_assoc($result)){
  $coord_gps = $row["coord_gps_perso"];
  $explode = explode(",", $coord_gps);
  $latitude = $explode[0];
  $longitude = $explode[1];
  $nom = $row["nom"];
  $prenom = $row["prenom"];
	$json[] = $tab;
	$json[] = "\t\t'nom': '".addslashes($nom)."',";
	$json[] = "\t\t'prenom': '".addslashes($prenom)."',";
	$json[] = "\t\t'latitude': '".addslashes($latitude)."',";
	$json[] = "\t\t'longitude': '".addslashes($longitude)."'";
	$json[] = "\t}";
	$tab = "\t\t,\t{";
}
$json[] = "];";
$jsonFinal = join("\n", $json);
echo $jsonFinal;
?>
donc là, le résultat est correct lorsque j'inscris directement json.php?id_batiment=2 dans ma barre d'adresse.
J'obtiens ceci :

Code : Tout sélectionner

[ { 'nom': 'ggggg', 'prenom': 'ggggg', 'latitude': '47.873985', 'longitude': '6.388863' } ];
-> il y a un enregistrement qui correspond au batiment 2


En revanche lorsque j'essai d'afficher la carte avec une liste de ces personnes correspondant au batiment 2 en utilisant index.php, la aucun affichage et ma carte m'affiche l'océan pacifique.

En mettant une requête plus simple SELECT * FROM personnes, là ça marche.

Pourquoi cette requête utilisant les jointures ne marche pas, comment peut-on la remplacer ?

Posté : 19 févr. 2008, 16:42
par Hubert Roksor
Débogue ton programme et donne-nous le message d'erreur, sinon on peut passer la semaine à deviner...

Posté : 19 févr. 2008, 16:51
par béka
Le truc c'est que je n'ai pas de message d'erreur.
J'utilise ce script : http://www.touraineverte.com/Google-Map ... /index.php

Mais dans mon fichier json.php avec la requete SQL utilisant les JOIN, la carte qui est affiichée n'est pas la bonne puisque j'affiche l'océan pacifique alors qu'avec une requête plus simple telle que SELECT * FROM table, là ma carte est affichée correctement (avec la bonne échelle et sur la bonne région).

De ce fait, j'en déduis que le problème d'affichage de ma Google Map vient de ma requête SQL, Comment peut-on alors faire pour que cette requete avec les JOIN soit différente ?

Posté : 19 févr. 2008, 22:04
par Truc
De ce que je me souviens, MySQL ne supporte pas l'alias d'une table sans le "AS".
Ben non j'ai toujours fait comme sans :-k
Je n'utilise le "as" que pour les champs.


Sujet [Résolu] sans réponse hmm... merci pour les autres :-k