Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/06/2007, 13h35   #1
Membre du Club
 
Inscription : janvier 2006
Messages : 250
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : janvier 2006
Messages : 250
Points : 64
Points : 64
Par défaut Distinct sur jointure ineficace

Bonjour à tous,

Voila j'ia une base mssql et j'effectue une requete qui s'aparente à :
Code :
1
2
3
4
5
$query_pers ='SELECT DISTINCT(T_SAL.MATRICULE_),T_PERS.NOM_ ,T_PERS.PRENOM_ ,T_AFFEC.TITRE_ZONE_ ,T_AFFEC.TEXTE_'
        . ' FROM '.$Table_pers.' T_PERS , '.$Table_sal.' T_SAL , '.$Table_affec.' T_AFFEC'
		. ' WHERE T_SAL.PERSONNE_ = T_PERS.PERSONNE_'
		. ' AND T_SAL.PERSONNE_ = T_AFFEC.SALARIE_'
		. ' AND TITRE_ZONE_ IN ("2","3");';
La requete me retourne deux fois les memes usagés ce qui normale car ils ont chacun un titre_zone(1 et 2), cependant le terme DISTINCT ne devrait-il pas me retourner qu'un seul nom ?
J'espere avoir été assez clair ...
Merci pour votre soutient .
javaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 13h39   #2
Membre éprouvé
 
Avatar de chrifo
 
Inscription : juillet 2006
Messages : 445
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 445
Points : 418
Points : 418
Bonjour,
Le distinct s'applique à tous les champs. Les fonctions d'agrégats peuvent répondre à votre besoin.
chrifo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 13h48   #3
Membre du Club
 
Inscription : janvier 2006
Messages : 250
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : janvier 2006
Messages : 250
Points : 64
Points : 64
Je ne voit pas bien ce qu'est une focntion d'agraga pourriez vous m'en dire d'avantage en attendant je me renseigne sur le net... De mes cours je me rappel que l'agrégat sert a faire des MAX, SUM etc ...
javaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 13h56   #4
Membre éprouvé
 
Avatar de chrifo
 
Inscription : juillet 2006
Messages : 445
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 445
Points : 418
Points : 418
Ca va vous donner quelque chose comme ça :
Code :
1
2
3
4
5
6
7
 
$query_pers ='SELECT T_SAL.MATRICULE_,T_PERS.NOM_ ,T_PERS.PRENOM_ ,max(T_AFFEC.TITRE_ZONE_)'
        . ' FROM '.$Table_pers.' T_PERS , '.$Table_sal.' T_SAL , '.$Table_affec.' T_AFFEC'
		. ' WHERE T_SAL.PERSONNE_ = T_PERS.PERSONNE_'
		. ' AND T_SAL.PERSONNE_ = T_AFFEC.SALARIE_'
		. ' AND TITRE_ZONE_ IN ("2","3")'
        . ' GROUP BY T_SAL.MATRICULE_,T_PERS.NOM_ ,T_PERS.PRENOM_;';
Vous êtes forcés de chosir quel "titre_zone" vous voulez ramener. Ici j'ai choisi le max. Pour ramener le libellé correspondant vous pouvez passer par une sous requête.

NB: je viens de voir le critère TITRE_ZONE_ IN ("2","3") ... et vous dites que la requête ramène l'enregistrement avec la valeur "1" ?
chrifo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 14h05   #5
Membre du Club
 
Inscription : janvier 2006
Messages : 250
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : janvier 2006
Messages : 250
Points : 64
Points : 64
Je vais aller plus loin dans mon explication afin qu'on soit sur la meme longueur d'onde :
-J'ai 3 tables :

PERSONNE
Personne_(ID)
Nom_
Prenom_

SALARIE
Personne_(ID)
Matricule_

AFFECTATION
Salarie_(ID)
Titre_zone_
Texte_

Je récupere nom prenom matricule texte...
Mon probleme dans ce cas present est le suivant :
Pour un salarie (table AFFECTATION) j'ai titre_zone qui contient 1 et 2 comme ci contre :

Salarie|Titre_zone_|Texte|
BOBI | 1 | 062
BOBI | 2 | 5002

Texte étant variable
J'amerai afficher ceci :
NOM | PRENOM | MATRICULE | SITE | Centre |
x | bobi | 12 | 062 | 5002 |

Voila je ne sais pas si ca va vous eclairez , je ne sais pas trop comment faire (une table temp p être ) .
javaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 14h20   #6
Membre éprouvé
 
Avatar de chrifo
 
Inscription : juillet 2006
Messages : 445
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 445
Points : 418
Points : 418
Cela ne suffit-il pas ? :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
   Nom_ NOM,
   Prenom_ PRENOM,
   Matricule_ MATRICULE,
   AFF1.Texte SITE,
   AFF2.Texte Centre
FROM
   PERSONNE, SALARIE, AFFECTATION AFF1 , AFFECTATION AFF2
WHERE
   PERSONNE.Personne_ = SALARIE.Personne_
   AND PERSONNE.Personne_ = AFF1.Salarie_
   AND PERSONNE.Personne_ = AFF2.Salarie_
   AND AFF1.Titre_zone_="1"
   AND AFF2.Titre_zone_="2"
chrifo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 14h54   #7
Membre du Club
 
Inscription : janvier 2006
Messages : 250
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : janvier 2006
Messages : 250
Points : 64
Points : 64
En effet je pense que cela peut etre une solution que je n'avai pas envisagée toutefois : j'ai retranscrit en PHP
Code :
1
2
3
4
5
6
7
$query_pers ='SELECT PERS.NOM_ ,PERS.PRENOM_ , SAL.MATRICULE_ , AFC1.TEXTE_ , AFC2.TEXTE_ '
	. ' FROM  '.$Table_pers.' PERS , '.$Table_sal.' SAL , '.$Table_affec.' AFC1, '.$Table_affec.' AFC2'
	. ' WHERE  PERS.PERSONNE_ = SAL.PERSONNE_'
	. ' AND PERS.PERSONNE_ = AFC1.SALARIE_ '
	. ' AND PERS.PERSONNE_ = AFC2.SALARIE_ '
	. ' AND AFC1.TITRE_ZONE_="2" '
	. ' AND AFC2.TITRE_ZONE_="3";';
Lorsque j'execute il me dit :

Notice: Undefined index: TITRE_ZONE_ in /home/httpd/dev/badges/affichage.php on line 62

Or TITRE_ZONE_ est connus .
NB : Je ne savais pas que l'on pouvait utiliser deux fois la meme table en lui donnant un "login" différent.
javaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 14h59   #8
Membre du Club
 
Inscription : janvier 2006
Messages : 250
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : janvier 2006
Messages : 250
Points : 64
Points : 64
Quelle tete de cloche !!!!
Je me suis trompé de variable et en plus c'était même pas sur la bonne ligne, je vais essayer d'exploiter le resultat ...
Merci pour votre précieuse aide, qui m'a en plus apporté un savoir ...
javaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h39.


 
 
 
 
Partenaires

Hébergement Web