Quand 2 clés etrangeres se référent à un meme champs

Résolu
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006 - 3 janv. 2006 à 20:49
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 4 janv. 2006 à 13:55
Bonsoir à tous





Tout d'abord je vous explique mon architecture BDD





table Historique :


*id_historique


*actif


*passif


*id_piece


*id_action


*time





table Joueur :


*id_joueur


*pseudo





Voila, les attributs passif et actif de la table Historique sont
enfait des clés étrangères se referant à l'id_joueur de la table Joueur.





Je voudrait faire une requête sql qui m'affiche le tableau historique avec les pseudos respectifs des clés actif et passif.





Comment faire une jointure quand on a deux clés etrangere se referant au meme champs ?

19 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 janv. 2006 à 10:25
Alors, 2 requêtes :-(

SELECT

HISTO.ID_PIECE,
HISTO.ID_ACTION,
HISTO.TIME,
HISTO.PASSIF,
JR.PSEUDO AS PSEUDO_ACTIF
FROM
HISTORIQUE HISTO, JOUEUR JR
WHERE
HISTO.ACTIF = JR.ID_JOUEUR

mysql_query ...
while ($res = mysql_fetch_assoc(...)) {
// SELECT JR.PSEUDO FROM JOUEUR JR WHERE JR.ID_JOUEUR = '.$res['PASSIF'].'
// on récupère : mysql_query, mysql_fetch_assoc dans $res2...
// et enfin, on affiche chaque $res et $res2.
}
3
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006
4 janv. 2006 à 01:19
J'ai fait un petit shema pour mieux comprendre :
0
cs_f6xara Messages postés 68 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 6 février 2008
4 janv. 2006 à 08:56
Celà ne marche-t-il pas? Select * from historique, joueur where actif=id_joueur and passif = id_joueur
0
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006
4 janv. 2006 à 09:04
non car comment selectionne tu les pseudos ?
0

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

Posez votre question
cs_f6xara Messages postés 68 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 6 février 2008
4 janv. 2006 à 09:08
Je suis pas sur de comprendre ta réponse mais peut être une solution

Select * from historique, joueur where actif=id_joueur and passif = id_joueur where pseudo = 'le pseudo"
0
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006
4 janv. 2006 à 09:33
Enfait je souhaite afficher le tableau Historique, mais a la place
d'avoir les numero d'actif et passif, je voudrais avoir leur pseudo.



J'ai un debut de réponse avec cette maniere de proceder, mais le probleme c'est que cela n'affiche rien lol.



SELECT h.id_historique, j1.pseudo AS joueurActif, j2.pseudo AS joueurPassif, h.id_piece, h.id_action, h.time
FROM Historique AS h, Joueur AS j1, Joueur AS j2
WHERE h.actif = j1.id_joueur
AND h.passif = j2.id_joueur
AND (
h.actif =14
OR h.passif =14
)
0
cs_f6xara Messages postés 68 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 6 février 2008
4 janv. 2006 à 09:43
Tu dois le faire sous 2 requetes car tu fais les jointures correspondantes à une requete ou tu voudrais tous les passifs ET actifs
SELECT id_historique, pseudo, id_piece, id_action, time
FROM Historique , Joueur
WHERE actif = id_joueur
AND actif =14

SELECT id_historique, pseudo, id_piece, id_action, time
FROM Historique , Joueur
WHERE passif = id_joueur
AND passif =14
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 janv. 2006 à 09:57
Hello,

SELECT
HISTO.ID_PIECE,
HISTO.ID_ACTION,
HISTO.TIME,
JR.PSEUDO AS PSEUDO_ACTIF,
JR2.PSEUDO AS PSEUDO_PASSIF
FROM
HISTORIQUE HISTO,
JOUEUR JR,
JOUEUR JR2
WHERE JR2.PSEUDO (SELECT JOUEUR.PSEUDO FROM JOUEUR WHERE JOUEUR.ID_JOUEUR HISTO.PASSIF) AND JR.PSEUDO (SELECT JOUEUR.PSEUDO FROM JOUEUR WHERE JOUEUR.ID_JOUEUR HISTO.ACTIF)
0
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006
4 janv. 2006 à 10:19
salut malalam,



Les requetes imbriqués sont elles la seule solution ? Car ma bdd ne les supporte pas :(
0
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006
4 janv. 2006 à 13:10
merci malalam, j'essaie de mettre ca en forme, et je vous tiens au courant ;)
0
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006
4 janv. 2006 à 13:21
Ok merci bien cela marche. Par contre j'aurai une autre question. Il
est possible que le champs passif soit NULL ou bien "0" quand l'action
ne fait pas intervenir de second joueur.



Dans ce cas la, comment dois je rediger la seconde requête pour ne pas
qu'elle cherche le pseudo de passif qu'elle ne trouvera jamais ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 janv. 2006 à 13:25
dans le while de la 1ère requête :

if (0 != $res['PASSIF'] || null != $res['PASSIF']) {
// seconde requête, on obtiendra le pseudo passif dans $res2['PSEUDO']
} else {
$res2['PSEUDO'] = 'pas de pseudo passif';
}
//affichage de $res et $res2.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 janv. 2006 à 13:26
J'ai fait une erreur : c'est pas || mais &&, dans la condition.
0
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006
4 janv. 2006 à 13:27
Un grand merci malalam ;)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 janv. 2006 à 13:30
Je t'en prie :-)
0
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006
4 janv. 2006 à 13:38
Cela marche impeccable, par contre mon code n'est peut etre pas le mieux, j'ai recupéré mes anciens code de de php/sql.



J'ai fait ainsi :



require('_connex.php');

$sql = 'SELECT
H.id_piece,H.id_action,H.time,H.passif,J.pseudo AS Pseudo_actif FROM
Historique H, Joueur J WHERE H.actif = J.id_joueur AND
actif="'.$_SESSION[id_joueur].'" ORDER BY id_historique ASC';

$query = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());

while($data = mysql_fetch_array($query)) {



if($data['passif']!=0)

{

$sql2 'SELECT J.pseudo FROM Joueur J WHERE J.id_joueur "'.$data['passif'].'"';

$query2 = mysql_query($sql2) or
die('Erreur SQL !
'.$sql2.'
'.mysql_error());

while($data2 = mysql_fetch_array($query2)) {



echo $data["time"]." :
".$data["type"]." de ".$data["Pseudo_actif"]." sur ".$data2["pseudo"]."
dans ".$data["id_piece"]."
";

}

}

else

{

echo $data["time"]." :
".$data["type"]." de ".$data["Pseudo_actif"]." dans
".$data["id_piece"]."
";

}

}

mysql_close();
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 janv. 2006 à 13:47
Re :-)

Je ne pige pas cette clause dans ta requête principale :
AND actif="'.$_SESSION[id_joueur].'"

Elle sert à quoi? En plus, tu devrais utiliser h.actif.

mysql_fetch_array () en l'état ne sert pas à grand chose, puisqu'elle va faire double emploi : renvoyer à la fois des index numériques ET des index associatifs. Si tu veux utiliser des index associatifs, utilise soit mysql_fetch_assoc, soit mysql_fetch_array avec l'option <tt>MYSQL_ASSOC
http://fr2.php.net/manual/fr/function.mysql-fetch-array.php

</tt>Il est préférable d'utiliser des apostrophes, que ce soit dans echo, ou tes clefs associatives, ou tes chaînes autres (requêtes par exemple) :
echo 'bla =>', $tab['clef'];

Et tu peux utiliser require_once() au lieu de require().

A part ça, tout va bien :-)
0
cs_Franquito Messages postés 61 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 23 décembre 2006
4 janv. 2006 à 13:51
Ok je vais remplacer mysql_fetch_array par mysql_fetch_assoc si je comprend bien.



En revanche, j'utilise la session[id_joueur] car c'est pour afficher
l'historique des actions du joueur connecté. Je ne veux pas que le
joueur puisse consulter l'historique de ses semblabes ;)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 janv. 2006 à 13:55
Ah oui, ok :-)
Juste :

$_SESSION['id_joueur']
0
Rejoignez-nous