Soucis sur une requête sql.


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Soucis sur une requête sql.

Message le Mer Aoû 27, 2008 20:59

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


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Mer Aoû 27, 2008 21:03

Un DISTINCT fait sauter les doublons si les tuples sont identiques
Un GROUP BY departement groupera tes résultats par departement identiques


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Message le Mer Aoû 27, 2008 21:39

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: Tout sélectionner
<?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: Tout sélectionner
$query2 = mysql_query("SELECT DISTINCT departement FROM LOCALISATION  WHERE id = $monid");

Et
Code: Tout sélectionner
$query2 = mysql_query("SELECT DISTINCT (departement) FROM LOCALISATION  WHERE id = $monid");

La requête m'affiche 2 fois le même département ..?

Merci


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Mer Aoû 27, 2008 21:59

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 ^^


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Message le Mer Aoû 27, 2008 22:14

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: Tout sélectionner
$query2 = mysql_query("SELECT DISTINCT departement FROM LOCALISATION  WHERE id = $monid");


J'ai ajouté en fin de requête:
Code: Tout sélectionner
   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: Tout sélectionner
SELECT DISTINCT departement FROM `LOCALISATION`

sa fonctionne ... j'en déduit que sa coince dans mon code..


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Mer Aoû 27, 2008 22:31

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: Tout sélectionner
$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))


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Message le Mer Aoû 27, 2008 22:48

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 ... :? .


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Mer Aoû 27, 2008 23:00

Un indice, rassembler le tout en une requête ^^

Code: Tout sélectionner
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


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Message le Mer Aoû 27, 2008 23:17

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


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Mer Aoû 27, 2008 23:22

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.


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Message le Jeu Aoû 28, 2008 13:01

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é.


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Jeu Aoû 28, 2008 13:09

T et L sont des alias pour éviter de devoir retaper les noms de tables entiers T... et LOCALISATION :)


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Message le Jeu Aoû 28, 2008 20:10

Donc:
Code: Tout sélectionner
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: Tout sélectionner
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: Tout sélectionner
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: Tout sélectionner
<?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


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Jeu Aoû 28, 2008 20:33

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


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Message le Jeu Aoû 28, 2008 22:17

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: Tout sélectionner
$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

Soucis sur une requête sql.

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités