Requête SQL - Jonction

Résolu
djsquinje Messages postés 744 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mai 2017 - 23 sept. 2014 à 14:28
mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 - 23 sept. 2014 à 19:18
Bonjour à vous tous

Je doit faire une requête SQL, trop compliquer pour moi...

Voici mes deux tables :

membre :
id_mbr, login, pass_md5

agenda :
id_agd, dt, lieux, event, id_mbr (id_mbr = login du membre)

Voici le but de ma requête :

Lorsqu'un utilisateur ce connecte il voit les informations de son agenda.


Si vous avez une petite aide ;)

Quand on est mort, on ne sait pas qu'on est mort; C'est pour les autres que c'est difficile. Quand on est con, c'est pareil...

4 réponses

mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 4
23 sept. 2014 à 14:34
Bonjour,

Vous n'avez pas besoin de faire une jointure, juste un filtrage:

$idMbr = "moiToto";
$sql = ".................... WHERE id_mbr='".$idMbr."'"

listera les fiches du membre moiToto

A+
0
jordane45 Messages postés 38242 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 octobre 2024 345
23 sept. 2014 à 14:46
Bonjour,

Je rejoins mpm93 sur la réponse qu'il te donne.
Si l'utilisateur est connecté... tu en connais son ID... et donc un simple WHERE suffirait.

Par contre, je te déconseille d'utiliser le Login comme "lien" entre tes tables.
membre : id_mbr, login, pass_md5

agenda : id_agd, dt, lieux, event, id_mbr (id_mbr = login du membre


Il est préférable d'utiliser les ID ( correspondants de façons sûr à des nombre ou des matricules UNIQUES ) plutôt que les login qui sont des chaines de caractères (du texte).
Niveau performances... il vaut mieux filtrer sur du numéric ( int, BigInt;..) que sur du varchar / texte ..

Donc il serait mieux d'avoir :
membre.id_membre = agenda.id_membre


Pour ce qui est de la jointure (si au final tu veux vraiment en faire une) tu peux la faire de plusieurs façons:

Par exemple:

SELECT *
FROM agenda a
LEFT JOIN membre  m ON m.id_membre = a.id_membre
WHERE m.id_membre ='$id_membre'


ou comme ça :
SELECT *
FROM agenda a
        ,membre  m 
WHERE m.id_membre = a.id_membre 
  AND   m.id_membre ='$id_membre'



NB : Je préfère la première solution.
Nb²: Tu peux remplacer le "*" par la liste des champs que tu veux récupérer.

0
djsquinje Messages postés 744 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mai 2017 3
Modifié par jordane45 le 23/09/2014 à 15:07
Donc pour la 1er solution : membre.id_membre = agenda.id_membre

Je fait :
select * from (je met quoi) membre.id_membre = agenda.id_membre
?

Merci pour les solutions

EDIT : Ajout des balises de code.
0
mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 4
23 sept. 2014 à 19:18
L'idée est aussi d'utiliser une variable de session qui mémorise le id de l'utilisateur connecté.
0
djsquinje Messages postés 744 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mai 2017 3
23 sept. 2014 à 14:46
Je suis un grand débutant en SQL, donc une plus grande explication ne sera pas un refus ;)
0
jordane45 Messages postés 38242 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 octobre 2024 345
23 sept. 2014 à 14:47
regarde ma réponse
0
jordane45 Messages postés 38242 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 octobre 2024 345
23 sept. 2014 à 15:07
Je fait : select * from (je met quoi) membre.id_membre = agenda.id_membre ?

Comment ça tu mets quoi ????
je t'ai écrit la requête....
SELECT *
FROM agenda a
LEFT JOIN membre  m ON m.id_membre = a.id_membre
WHERE m.id_membre ='$id_membre'


Dans le SELECT tu y mets les noms des champs que tu veux récupérer ..
* veut dire que tu les veux tous...mais tu pourrais ne choisir de récupérer QUE les "dt" et les "lieux" par exemple.... et dans ce cas tu écrirais
SELECT dt,lieux
FROM agenda a
LEFT JOIN membre m ON m.id_membre = a.id_membre
WHERE m.id_membre="id_du_membre"


Si tu ne sais pas comment utiliser les requêtes de type 'SELECT' en SQL je t'invite à te documenter...
par exemple : http://sql.sh/cours/select

PS : Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
0
djsquinje Messages postés 744 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mai 2017 3
23 sept. 2014 à 15:30
Merci ca fonctionne, ma super camarade (ahah) ma aider et voici le code fonctionelle :

<?php
$requete = "select A.dt, A.lieu, A.event
FROM agenda A, membre M
WHERE A.id_mbr = M.login
AND M.login = '".$_SESSION['login']."'";
$result = mysql_query($requete) or die(mysql_error());

while($obj = mysql_fetch_object($result))
{
	echo $obj->dt.' '.$obj->lieu.' '.$obj->event;
}
?>
0
jordane45 Messages postés 38242 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 octobre 2024 345
Modifié par jordane45 le 23/09/2014 à 15:58
Ca c'est le choix numéro 2 ^^

Par contre, tu as conservé le LOGIN comme instruction dans ton WHERE...
c'est dommage.
Comme je te l'ai indiqué... il est préférable d'utiliser plutôt un ID (numérique) qu'une "string" ...

Enfin bon, si tu souhaites conserver absolument le LOGIN tu peux aussi utiliser le choix 1 histoire de perfectionner ton code ajouter quelques vérifications...:

<?php
$login =isset($_SESSION['login'])?$_SESSION['login']:null;
if($login){
  $requete ="SELECT a.dt
              ,a.lieu
              ,a.event
       FROM agenda a
       LEFT JOIN membre  m ON m.id_membre = a.id_membre
       WHERE m.login = '".$login."'";
 
   $result = mysql_query($requete) or die(mysql_error());
   if(mysql_num_rows($result)>0){
     while($obj = mysql_fetch_object($result)) {
           echo $obj->dt.' '.$obj->lieu.' '.$obj->event;
     }
  }else{
    echo "<br> il n'y a aucun résultat pour cette requête!";
  }
}else{
  echo "<br> Le login n'est pas renseigné !";
}

?>


EDIT : oupsss...petite correction... inversion de ligne entre le mysql_num_rows ... et l'execution de la requête mysql_query
0
jordane45 Messages postés 38242 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 octobre 2024 345
23 sept. 2014 à 15:40
Et Si la question est résolue..
Merci de ne pas oublier de clôturer le sujet
(en cliquant sur le lien "Marquer comme résolu" qui se trouve sous le titre de la question)

Cordialement,
Jordane
0
jordane45 Messages postés 38242 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 octobre 2024 345
23 sept. 2014 à 15:43
PS: Actuellement tu utilises l'extension mysql ( mysql_query ... mysql_num_rows ... )
Cette extension est obsolète et a terme sera supprimée.
Il faut que tu commences à t'orienter vers mysqli ou la pdo...
Je t'invite à lire ceci :
http://php.net/manual/fr/faq.databases.php#faq.databases.mysql.deprecated
0
djsquinje Messages postés 744 Date d'inscription lundi 19 janvier 2009 Statut Membre Dernière intervention 31 mai 2017 3
23 sept. 2014 à 15:55
Merci pour toi, maintenant que j'ai la base, je module a ma manière en suivant tous les conseilles.

Merci encore ;)
0
Rejoignez-nous