gabs77
Messages postés379Date d'inscriptionmardi 6 décembre 2005StatutMembreDernière intervention 8 octobre 2008
-
16 juin 2006 à 09:53
gabs77
Messages postés379Date d'inscriptionmardi 6 décembre 2005StatutMembreDerniè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
gabs77
Messages postés379Date d'inscriptionmardi 6 décembre 2005StatutMembreDerniè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 -->
cs_PoFMaN
Messages postés58Date d'inscriptiondimanche 12 décembre 2004StatutMembreDernière intervention21 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
gabs77
Messages postés379Date d'inscriptionmardi 6 décembre 2005StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_PoFMaN
Messages postés58Date d'inscriptiondimanche 12 décembre 2004StatutMembreDernière intervention21 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
gabs77
Messages postés379Date d'inscriptionmardi 6 décembre 2005StatutMembreDerniè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)
gabs77
Messages postés379Date d'inscriptionmardi 6 décembre 2005StatutMembreDerniè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'
gabs77
Messages postés379Date d'inscriptionmardi 6 décembre 2005StatutMembreDerniè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
cs_PoFMaN
Messages postés58Date d'inscriptiondimanche 12 décembre 2004StatutMembreDernière intervention21 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