Quand 2 clés etrangeres se référent à un meme champs [Résolu]

cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 3 janv. 2006 à 20:49 - Dernière réponse : malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention
- 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 ?
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 4 janv. 2006 à 10:25
3
Merci
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.
}

Merci malalam 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de malalam
cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 4 janv. 2006 à 01:19
0
Merci
J'ai fait un petit shema pour mieux comprendre :
Commenter la réponse de cs_Franquito
cs_f6xara 68 Messages postés samedi 1 novembre 2003Date d'inscription 6 février 2008 Dernière intervention - 4 janv. 2006 à 08:56
0
Merci
Celà ne marche-t-il pas? Select * from historique, joueur where actif=id_joueur and passif = id_joueur
Commenter la réponse de cs_f6xara
cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 4 janv. 2006 à 09:04
0
Merci
non car comment selectionne tu les pseudos ?
Commenter la réponse de cs_Franquito
cs_f6xara 68 Messages postés samedi 1 novembre 2003Date d'inscription 6 février 2008 Dernière intervention - 4 janv. 2006 à 09:08
0
Merci
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"
Commenter la réponse de cs_f6xara
cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 4 janv. 2006 à 09:33
0
Merci
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
)
Commenter la réponse de cs_Franquito
cs_f6xara 68 Messages postés samedi 1 novembre 2003Date d'inscription 6 février 2008 Dernière intervention - 4 janv. 2006 à 09:43
0
Merci
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
Commenter la réponse de cs_f6xara
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 4 janv. 2006 à 09:57
0
Merci
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)
Commenter la réponse de malalam
cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 4 janv. 2006 à 10:19
0
Merci
salut malalam,



Les requetes imbriqués sont elles la seule solution ? Car ma bdd ne les supporte pas :(
Commenter la réponse de cs_Franquito
cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 4 janv. 2006 à 13:10
0
Merci
merci malalam, j'essaie de mettre ca en forme, et je vous tiens au courant ;)
Commenter la réponse de cs_Franquito
cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 4 janv. 2006 à 13:21
0
Merci
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 ?
Commenter la réponse de cs_Franquito
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 4 janv. 2006 à 13:25
0
Merci
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.
Commenter la réponse de malalam
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 4 janv. 2006 à 13:26
0
Merci
J'ai fait une erreur : c'est pas || mais &&, dans la condition.
Commenter la réponse de malalam
cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 4 janv. 2006 à 13:27
0
Merci
Un grand merci malalam ;)
Commenter la réponse de cs_Franquito
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 4 janv. 2006 à 13:30
0
Merci
Je t'en prie :-)
Commenter la réponse de malalam
cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 4 janv. 2006 à 13:38
0
Merci
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();
Commenter la réponse de cs_Franquito
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 4 janv. 2006 à 13:47
0
Merci
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 :-)
Commenter la réponse de malalam
cs_Franquito 61 Messages postés mardi 5 avril 2005Date d'inscription 23 décembre 2006 Dernière intervention - 4 janv. 2006 à 13:51
0
Merci
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 ;)
Commenter la réponse de cs_Franquito
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 4 janv. 2006 à 13:55
0
Merci
Ah oui, ok :-)
Juste :

$_SESSION['id_joueur']
Commenter la réponse de malalam

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.