Page 1 sur 1

Jointure qui affiche trop d'information

Posté : 13 févr. 2007, 00:18
par Arthalion
Bonsoir,

Ce n'est certainement pas un problème, mais plutôt d'un conseil dont j'ai besoin à propos de la récupération de champs après plusieurs jointures.

Voici un schéma de ma DB, d'abord les tables puis ensuite les champs importants :

persos : idperso, nom, prenom, etc ...
disciplines : iddisciplines, idperso, disciplines
competences : idcompetences, idperso, competences

Je fais donc deux jointures persos.idperso = disciplines.idperso AND persos.idperso=competences.idperso, et j'indique sur quel idperso je veux que la requête porte, ex : persos.idperso = 1

Sachant qu'un personnage à au moins 3 disciplines et 3 compétences.

La requête SQL fonctionne à merveille sauf que des informations telles le nom et le prénom du personnage sont répétées plusieurs fois. Je pense déjà qu'ici, il y aurait moyen d'optimiser ou peut-être pas ...

Ensuite ce que je veux faire, c'est récupérer dans une variable, ou plutôt array, pour ce personnage ses compétences et disciplines. Comment faire ? Lorsque je fais un mysql_fetch_array, ce qui est initialisé dans mes variables, c'est uniquement la dernière rangée retournée par la requête sql. Alors jusque là rien d'aberrant. Mais existe-t-il en PHP une fonction qui permet de mettre dans un array() des valeurs différentes pour un champ (ex du champ compétences) ?

Je ne sais pas si j'ai été assez clair, merci par avance pour vos réponses.

Posté : 13 févr. 2007, 00:52
par Truc
Salut,

1er souci vient de mauvaises jointures... essaie :

Code : Tout sélectionner

persos.idperso = disciplines.idperso AND disciplines.idperso = competences.idperso
2eme souci, il faut boucler avec un while (ou for) regarde la doc pour mysql_fetch_assoc() (par exemple)

Posté : 13 févr. 2007, 11:53
par Invité
J'ai modifié la jointure, et le résultat est le même.

Comme je n'étais pas chez moi hier soir je n'avais pas accès au code voici ma requête sql :
 $fiche_sql = mysql_query("select p.PTSCREA,p.PTSBONUS,p.DATECREA,p.CONTE,p.NOM,p.PRENOM,p.DATENAISS,p.STATUS,p.POSTE,p.CLAN,p.SIRE,p.DATEVAMP,p.NATURE,p.NATURE2,p.ATTITUDE,p.ATTITUDE2,p.GENERATION, p.GENECREA,p.HUMANITE,p.HUMACREA,p.VOLONTE,p.PHYSIQUE,p.MENTAL,p.SOCIAL, p.VALID, p.DATEVALID, p.NOMVALID, p.IDJOUEUR, j.NOM as NOMJOUEUR, j.PRENOM as PRENOMJOUEUR,c.IDPERSO,c.COMPET,c.NIVCOMPET,d.IDPERSO, d.DISC,d.NIVDISC from persos p, joueurs j, competences c, disciplines d WHERE j.IDJOUEUR = p.IDJOUEUR AND p.IDPERSO = c.IDPERSO AND p.IDPERSO=d.IDPERSO AND p.IDPERSO = '".$idperso."'");
 while ($res = mysql_fetch_assoc($fiche_sql)){
 	$idjoueur = $res['IDJOUEUR'];
 	$ptscrea= $res['PTSCREA'];
 	$ptsbonus = $res['PTSBONUS'];
 	$datecrea = $res['DATECREA'];
 	$conte = $res['CONTE'];
 	$nom = $res['NOM'];
 	$prenom = $res['PRENOM'];
 	$datenaiss = $res['DATENAISS'];
 	$status = $res['STATUS'];
 	$poste = $res['POSTE'];
 	$clan = $res['CLAN'];
 	$sire = $res['SIRE'];
 	$datevamp = $res['DATEVAMP'];
 	$nature = $res['NATURE'];
 	$nature2 = $res['NATURE2'];
 	$attitude = $res['ATTITUDE'];
 	$attitude2 = $res['ATTITUDE2'];
 	$generation = $res['GENERATION'];
 	$genecrea = $res['GENECREA'];
 	$humanite = $res['HUMANITE'];
 	$humacrea = $res['HUMACREA'];
 	$volonte = $res['VOLONTE'];
 	$derangement = $res['DERANGEMENT']; /*à exploder*/
 	$deracrea = $res['DERACREA']; /*à exploder*/
 	$physique = $res['PHYSIQUE'];
 	$social = $res['SOCIAL'];
 	$mental = $res['MENTAL'];
 	$disc = $res['DISC']; /*à exploder*/
 	$nivdisc = $res['NIVDISC']; /*à exploder*/
 	$compet = $res['COMPET']; /*à exploder*/
 	$nivcompet = $res['NIVCOMPET']; /*à exploder*/
 	$langues = $res['LANGUES']; /*à exploder*/
 	$influ = $res['INFLU']; /*à exploder*/
 	$nivinflu = $res['NIVINFLU']; /*à exploder*/
 	$valid = $res['VALID'];
 	$datevalid = $res['DATEVALID'];
 	$nomvalid = $res['NOMVALID'];
 	$idjoueur = $res['IDJOUEUR'];
 	$nomjoueur = $res['NOMJOUEUR'];
 	$prenomjoueur = $res['PRENOMJOUEUR'];
}
Quand je teste ma requête SQL sous phpmyadmin, ça me retourne 16 enregistrements. C'est à dire que tout ce qui est initialisé dans les variables fait partie du 16ème enregistrement. De plus, toutes les infos contenus dans la table persos sont répétées 16 fois, je ne pense pas que ce soit optimisé.

Alors faut-il que je teste à chaque enregistrement si la valeur du champ à changer et si oui, l'ajouter dans un array() ? ou Existe-t-il une autre solution ?