Soucis sur une requête sql.

WRInaute passionné
Bonsoir,
J'ai une petit soucis sur une requête que je ne parviens pas à régler.
Supposons une table nommé "localisation" composé entre autre d'un champ "departement". Le champs "departement" comporte plusieurs fois le même département.
id___departement
1__vendee
2__loire_atlantique
3__vendee
4__loire_atlantique

Quand je fais ma requête, j'ai forcement tout qui s'affiche alors que je voudrais afficher qu'une seule fois un département même si il est présent plusieurs fois dans la table.
Est ce possible ? Comment faire ?
Merci
 
WRInaute accro
Un DISTINCT fait sauter les doublons si les tuples sont identiques
Un GROUP BY departement groupera tes résultats par departement identiques
 
WRInaute passionné
Merci YoyoS, je ne connaissais pas :D .
J'ai essayé avec DISTINCT mais sans succès ... je dois mal m'y prendre à mon avis.
Ma requête:
Code:
<?php

include("data_bd.php");

mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe");
mysql_select_db("$nom_de_la_base") or die('Impossible de s&eacute;lectionner une base de donn&eacute;e. Assurez vous d\'avoir 

correctement remplit les donn&eacute;es du fichier data_bd.php.');

//on selectionne l'id et la situation
$query1 = mysql_query("SELECT id, situation FROM TYPE_DE_LOCATION WHERE situation = 'bord_de_mer' ORDER BY Times DESC");

$monid="";
$la_situation="";

while($location = mysql_fetch_array($query1))
 {
   $monid = $location['id'];
   $monid.="$id";

   $la_situation = $location['situation'];
   $la_situation.="$situation";
   
//on ne ferme pas la boucle pour selectionner les departements
//les id retournés affichent uniquement la situation bord_de_mer

$query2 = mysql_query("SELECT departement FROM LOCALISATION  WHERE id = $monid");


$le_departement="";

while($localisation = mysql_fetch_array($query2))
 {

   $le_departement = $localisation['departement'];
   $le_departement.="$departement";
   
   echo ''.$le_departement.'<br/>';

 }
 }
 ?>
J'ai essayé :
Code:
$query2 = mysql_query("SELECT DISTINCT departement FROM LOCALISATION  WHERE id = $monid");
Et
Code:
$query2 = mysql_query("SELECT DISTINCT (departement) FROM LOCALISATION  WHERE id = $monid");
La requête m'affiche 2 fois le même département ..?

Merci
 
WRInaute accro
Bizarre, c'est forcément que tes départements ne sont pas identiques alors. Il n'y a pas un espace dans l'un qu'il n'y aurait pas dans l'autre, ou un truc du genre ?

Faut pas oublier qu'il y a une boucle, il passe peut-être 2 x et affiche donc 2x l'unique département ^^
 
WRInaute passionné
Je viens de vérifier sous mysql, les 2 champs affichés sont identiques, sans espaces ni quoi que se soit d'autre.

Dans la requête je fais:
Code:
$query2 = mysql_query("SELECT DISTINCT departement FROM LOCALISATION  WHERE id = $monid");

J'ai ajouté en fin de requête:
Code:
   echo ''.$monid.'-'.$la_situation.'-'.$le_departement.'<br/>';
Et sa me retourne:
9-bord_de_mer-Loire_Atlantique
5-bord_de_mer-Loire_Atlantique

Les id sont bien différents et pourtant le même département s'affiche 2 fois .. pige pas la ?
Une suggestion ..?
Merci

Edit
Si je fais directement sous mysql:
Code:
SELECT DISTINCT departement FROM `LOCALISATION`
sa fonctionne ... j'en déduit que sa coince dans mon code..
 
WRInaute accro
C'est parce qu'avec ça, il fait 2 tours de boucle, il faut t'arranger pour qu'il n'en fasse qu'un:

Code:
$query1 = mysql_query("SELECT id, situation FROM TYPE_DE_LOCATION WHERE situation = 'bord_de_mer' ORDER BY Times DESC");

$monid="";
$la_situation="";

while($location = mysql_fetch_array($query1))
 
WRInaute passionné
Je ne comprend pas! Mes infos sont dans 2 bases différentes. Ma 1ere requête me permet de sélectionner les id qui correspondent à la situation 'bord_de_mer'. La seconde sélectionne les départements en fonction des id de la 1er boucle , et je ne vois vraiment pas comment faire autrement si ce n'est que de modifier entièrement ma base et la vingtaines de fichier codés derrières ... :? .
 
WRInaute accro
Un indice, rassembler le tout en une requête ^^

Code:
SELECT L.departement, T.situation FROM TYPE_DE_LOCATION T, LOCALISATION L WHERE T.id = L.Id AND T.situation = 'bord_de_mer' ORDER BY T.Times DESC
 
WRInaute passionné
Sa existe ce genre de requête :?: :) ... bon je dis sa parce que la je ne comprend rien ^^ et que j'aime bien comprendre... Je vais tester sa et décortiquer la chose :).
Merci YoyoS
 
WRInaute accro
Fais une jointure, tu ne travailleras que sur un résultat de base de données et donc une seule boucle, beaucoup plus facile à gérer ;)

Bonne nuit et à demain.
 
WRInaute passionné
La nuit est passé et me revoilà ... hoooo nonnnn ^^.
J'ai essayé ta requête et je l'ai adopté :wink: , grand merci. Par contre j'y comprend toujours rien ^^.
Je ne pige pas les T et les L ... ce sont des lettres au pif ?
Je vais me renseigner sur les (jointure), j'en ai entendu parlé mais je m'y suis jamais intéressé.
 
WRInaute accro
T et L sont des alias pour éviter de devoir retaper les noms de tables entiers T... et LOCALISATION :)
 
WRInaute passionné
Donc:
Code:
SELECT L.departement, T.situation FROM TYPE_DE_LOCATION T, LOCALISATION L WHERE T.id = L.Id AND T.situation = 'bord_de_mer' ORDER BY T.Times DESC
équivaut à
Code:
SELECT L.departement, T.situation FROM TYPE_DE_LOCATION situation, LOCALISATION departement WHERE situation.id = departement.Id AND situation.situation = 'bord_de_mer' ORDER BY situation.Times DESC
ou à
Code:
SELECT LOCALISATION.departement, TYPE_DE_LOCATION.situation FROM TYPE_DE_LOCATION T, LOCALISATION L WHERE TYPE_DE_LOCATION.id = LOCALISATION.Id AND TYPE_DE_LOCATION.situation = 'bord_de_mer' ORDER BY TYPE_DE_LOCATION.Times DESC
ou ni l'un ni l'autre?


Je vais abuser mais je ne m'en sort pas sur une autre requête au niveau des jointures. La requête est celle ci:
Code:
<?php
$le_departement=$_GET["departement"];

include("data_bd.php");

mysql_connect("$nom_du_serveur","$nom_utilisateur","$passe");
mysql_select_db("$nom_de_la_base") or die('Impossible de s&eacute;lectionner une base de donn&eacute;e. Assurez vous d\'avoir correctement remplit les donn&eacute;es du fichier data_bd.php.');

//on selectionne tout les départements par apport au departement transmit par $_GET
//on fait le trie dans la seconde requête en fonction de la situation
$query2 = mysql_query("SELECT id, region, ville FROM LOCALISATION WHERE departement = '".$le_departement."' ORDER BY Timestamp DESC");

$lid_en_cour="";
$la_region="";
$la_ville="";

while($localisation = mysql_fetch_array($query2))
 {
   $lid_en_cour = $localisation['id'];
   $lid_en_cour.="$id";

   $la_region = $localisation['region'];
   $la_region.="$region";

   $la_ville = $localisation['ville'];
   $la_ville.="$ville";
   
//on ne ferme pas la boucle   
//on selectionne le type de location en fonction des id de la 1ere boucle
$query1 = mysql_query("SELECT type_de_location, nombre_de_personne FROM TYPE_DE_LOCATION WHERE id = $lid_en_cour AND situation = 'bord_de_mer' ORDER BY Times DESC");

$le_type_de_location="";
$le_nombre_de_personne="";

while($location = mysql_fetch_array($query1))
 {

   $le_type_de_location = $location['type_de_location'];
   $le_type_de_location.="$type_de_location";
   
   $le_nombre_de_personne = $location['nombre_de_personne'];
   $le_nombre_de_personne.="$nombre_de_personne";
   
 }
 }
 ?>
Merci
 
WRInaute accro
ni l'un ni l'autre. Un alias c'est juste un diminutif c'est tout, te prend pas la tête !

Essaie de comprendre ce que fait la première requête avec jointure que je t'ai fait, après tu sauras faire les suivantes, ça nous évitera de toute te les faire ;)
 
WRInaute passionné
Mais heuuuu, je veux pas que l'on me fasse tout, je veux juste comprendre comment sa marche et ou est la logique ^^.
Ceci dit, je me suis trouvé une logique mais je ne suis pas certain que se soit la meilleurs ...

Bon après quelques touffes de cheveux en moins, j'ai pondus sa:
Code:
$query2 = mysql_query("SELECT T.id, T.type_de_location, T.nombre_de_personne, L.region, L.ville FROM LOCALISATION L,
 TYPE_DE_LOCATION T WHERE L.id = T.Id AND T.situation = 'bord_de_mer' AND departement = '$le_departement' ORDER BY L.Times DESC");
..et sa marche sur mes différents testes :D
Ceci fait, je veux juste savoir si ma requête te semble correcte (code en trop,mal faite ...) ou je ne sais quoi d'autre sans le faire à ma place, juste m'aiguiller, stp .

Et pour finir, peut on faire également une jointure sur 3 tables en même temps ?

Merci
 
WRInaute accro
Elle a l'air bien :D Tu utilises et comprend déjà mieux les alias que t'alleur on dirait :D

Oublie pas l'alias sur celui la, question de clareté:

Code:
AND departement

Tu peux faire une jointure sur autant de tables que tu veux, après évidemment elles deviennent plus lentes à exécuter, c'est pourquoi il faut mettre des index sur les petits champs souvent utilisés dans les jointures, comme les clés primaires ou référentielles. Maintenant, ça t'évite de faire 3 requêtes, donc c'est un + :)
 
WRInaute passionné
YoyoS a dit:
Elle a l'air bien :D Tu utilises et comprend déjà mieux les alias que t'alleur on dirait :D
J'espère que c'est le cas aussi ... ^^
YoyoS a dit:
Oublie pas l'alias sur celui la, question de clareté:
Donc :
Code:
AND L.departement
... si je ne me plante pas puisque le champ "departement" appartient à la table "LOCALISATION" (merci ^^)

YoyoS a dit:
Tu peux faire une jointure sur autant de tables que tu veux, après évidemment elles deviennent plus lentes à exécuter,

Si j'ai bien comprit le truc, on peut faire autant de jointure que l'on veut du moment qu'il y a au moins une "concordance" entre elles ?
Après, plus il y en a, plus sa rame.

YoyoS a dit:
...c'est pourquoi il faut mettre des index sur les petits champs souvent utilisés dans les jointures, comme les clés primaires ou référentielles. Maintenant, ça t'évite de faire 3 requêtes, donc c'est un + :)
Je suis que tu as fait exprès de me pondre sa sachant que j'allais encore patoger :D (je déconne, mais je capte rien quand même, mais je vais chercher ^^).

En tout cas, merci de tes réponses :wink:
 
Discussions similaires
Haut