Pb requete

gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008 - 16 juin 2006 à 09:53
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008 - 16 juin 2006 à 13:39
salut,
j'ai un pb avec une requete auquel je ne parviens pas a avoir un resultat satisfaisant
donc en fait g 3 tables :
- une table personnel : id_personnel, nom_pers, ... 
- une table materiel : id_materiel, modele, ... 
- une table affecter : id_materiel, id_personnel //elle resulte d une concatenation entre les 2 premieres

et je voudrais faire une liste de personnel, en prenant en compte le materiel si il y en a au moins un de affecter
 par exemple :  dans la bdd j'ai :

- table personnel : id_personnel, nom_pers, ... 
                              1, dupont, ...
                              2, smith, ...
                              3, langdon, ...
- table materiel : id_materiel, modele, type, ... 
                              1, ACER ASPIRE, ordinateur, ...
                              2, P III , ordinateur, ...
                              3, HP , ordinateur, ...
- table affecter : id_materiel, id_personnel //elle resulte d une concatenation 
                           1,2
                           2,1
                           1,3
et je voudrais un resultat similaire a cela
dupont  -->P III
smith     -->ACER ASPIRE
dupont  -->HP
langdon -->

 $sql= "SELECT * FROM $table_pers,  $table_aff_pers ".
   "WHERE ($table_aff_pers.id_personnel=$table_pers.id_personnel ".
   "OR $table_pers.id_personnel NOT IN (SELECT id_personnel FROM $table_aff_pers) ) ".
   "ORDER BY $table_pers.id_personnel ";
 $req = mysql_query($sql) or die (mysql_error());
 while ( $data = mysql_fetch_array($req))
  {
  echo $data['nom_pers'].'-->'.$data['modele'].'
';
  }
le pb est qu'il me sors effectivement toute la liste du personnel mais il fait apparaitre autant de fois kil il y a de concatenation celui qui n'a pas de materiel affecter

12 réponses

cs_PoFMaN Messages postés 58 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 21 juin 2006
16 juin 2006 à 10:02
Salut,

essaye de remplacer ton "order by" par "group by"
0
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008
16 juin 2006 à 10:15
le probleme change desormais voila le resultat ke sa me donne

dupont  -->P III
smith     -->ACER ASPIRE
langdon -->P III

se me donne tous le personnel mais sa donne une affectation la ou il n y en a pas et dupnt apprait qu'une fois avec une seule affectation au lieu de 2
j aimerai si possible ke sa me donne ceci
dupont  -->P III
smith     -->ACER ASPIRE
dupont  -->HP
langdon -->
0
cs_PoFMaN Messages postés 58 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 21 juin 2006
16 juin 2006 à 10:44
arf oui j'avais pas tous vu dsl

normalement avec une requete de ce style tu devrai avoir ce que tu veux (il y a peut être une autre méthode mais je voi pas la quelle):

select $table_pers.*, $table_aff_pers.id_materiel from $table_pers, $table_aff_pers where $table_aff_pers.id_personnel=$table_pers.id_personnel
union
select $table_pers.*, NULL from $table_pers, $table_aff_pers where $table_aff_pers.id_personnel!=$table_pers.id_personnel
order by id_personnel
0
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008
16 juin 2006 à 11:13
sa me semble etre le script kil me faut mais g un message d erreur
est ce ke le UNION est compatible avec Mysql ??

SELECT personnel.*, affectation_personnel.id_materiel FROM personnel, affectation_personnel WHERE affectation_personnel.id_personnel=personnel.id_personnel UNION ( SELECT personnel.*, NULL FROM personnel, affectation_personnel WHERE affectation_personnel.id_personnel<>personnel.id_personnel ) Erreur de syntaxe près de ')' à la ligne 1
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_PoFMaN Messages postés 58 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 21 juin 2006
16 juin 2006 à 11:27
oui enfin ca doit dépendre de la version quand meme avant de te l'envoyer j'ai testé sur mon serveur MySQL(v4.1.12) sinon je suis pas sur du '<>' j'ai jamais utilisé ca en SQL avec '!=' j'ai jamais eu de problèmes,

Et pour les parenthèses du 2ème select j'en ai jamais mis avec un union
0
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008
16 juin 2006 à 11:31
c bon sa marche !
g continué à chercher un peu tout de meme et j'y suis parvenu
la premiere partie est bonne les parentheses ne sont pas utiles pour l union mais la 2 condition fallait prendre le NOT IN et le tour est joué
je te remercie tu m as bien aidé PoFMaN

SELECT $table_pers.nom_pers, $table_aff_pers.id_materiel FROM $table_pers, $table_aff_pers WHERE $table_pers.id_personnel = $table_aff_pers.id_personnel 
UNION
SELECT $table_pers.nom_pers, NULL FROM $table_pers, $table_aff_pers WHERE $table_pers.id_personnel NOT IN (SELECT id_personnel FROM $table_aff_pers)
0
cs_PoFMaN Messages postés 58 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 21 juin 2006
16 juin 2006 à 11:34
Bizarre ca avec des tables qui fonctionnaient de la même façon j'avai pas eu de probleme
0
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008
16 juin 2006 à 11:47
ouais j avoue
mais maintenant avec la meme chose g encore un pb
je veu mettre des jointures et voici la réponse que l on me donne
"The used SELECT statements have a different number of columns"

voila le script :
=====
SELECT $table_pers.*, $table_aff_pers.*, $table_site.*, $table_serv.*, $table_pole.* 
FROM $table_pers, $table_aff_pers, $table_site, $table_serv, $table_pole
WHERE $table_aff_pers.id_personnel = $table_pers.id_personnel
AND $table_site.id_site = $table_pers.id_site
AND $table_pers.id_service = $table_serv.id_service
AND $table_serv.id_pole = $table_pole.id_pole
AND $table_pers.technicien = 'T' 
UNION
SELECT $table_pers.*,NULL , $table_site.*, $table_serv.*, $table_pole.*
FROM $table_pers, $table_aff_pers, $table_site, $table_serv, $table_pole
WHERE $table_pers.id_personnel NOT IN (SELECT id_personnel FROM $table_aff_pers) 
AND $table_site.id_site = $table_pers.id_site
AND $table_pers.id_service = $table_serv.id_service
AND $table_serv.id_pole = $table_pole.id_pole
AND $table_pers.technicien = 'T'
0
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008
16 juin 2006 à 11:53
c bon le pb est résolu en fait l erreur que g fait c que j ai mis une etoile dans le select a la table $table_aff_pers au lieu de cibler un champ
0
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008
16 juin 2006 à 12:01
décidément il y aura toujours un pb lol
"Table inconnue 'personnel' dans order clause"

SELECT $table_pers.*, $table_aff_pers.id_materiel, $table_site.*, $table_serv.*, $table_pole.* 
FROM $table_pers, $table_aff_pers, $table_site, $table_serv, $table_pole
WHERE $table_aff_pers.id_personnel = $table_pers.id_personnel
AND $table_site.id_site = $table_pers.id_site
AND $table_pers.id_service = $table_serv.id_service
AND $table_serv.id_pole = $table_pole.id_pole
AND $table_pers.technicien = 'T' 
UNION
SELECT $table_pers.*,NULL , $table_site.*, $table_serv.*, $table_pole.*
FROM $table_pers, $table_aff_pers, $table_site, $table_serv, $table_pole
WHERE $table_pers.id_personnel NOT IN (SELECT id_personnel FROM $table_aff_pers) 
AND $table_site.id_site = $table_pers.id_site
AND $table_pers.id_service = $table_serv.id_service
AND $table_serv.id_pole = $table_pole.id_pole
AND $table_pers.technicien = 'T'
ORDER BY $table_pers.id_personnel
0
cs_PoFMaN Messages postés 58 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 21 juin 2006
16 juin 2006 à 13:22
ben faut juste que te mette "order by id_personnel" -> il n'y a pas de différenciation de table puisque ton "order by" porte sur le résultat de l'union
0
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008
16 juin 2006 à 13:39
ok super merci
0
Rejoignez-nous