Aide pour une jointure

Eléphant du PHP | 283 Messages

27 juin 2015, 18:49

Bonjour,

Je suis actuellement en train de créer un fil d'actualité en fonction des membres qui se sont abonnés aux autres membres et j'aimerais afficher le fil d'actualité des membres que l'on suit.
Il y a en tout 3 tables : Membres, Notification, abonnement_membre.

Malheureusement je ne parviens pas au résultat escompté et je ne vois pas d’où viens mon erreur...
Voici mes différentes tables :
=>Table membres
-id
-pseudo
-motdepasse
...
=>Table notification
-id
-pseudo
-titre (ex: suit maintenant le membre)
-action
-date
=>Table abonnement_membre
-id
-id_posteur
-id_membre_suivi
-date

Voici ma tentative mais ça me donne des notifications de membres au hasard j'ai l'impression et pas des membres que je suit.
$id_member = $_SESSION['id'];
$getNewsQuery = $bdd->query("SELECT N.id, N.pseudo, N.titre, N.cible_action, DATE_FORMAT(N.date, '%d/%m/%Y à %Hh%imin') AS date, M.id, M.pseudo, M.avatar, A.id, A.id_posteur, A.id_membre FROM notification N, membres M, abonnement_membre A WHERE N.pseudo=A.id_membre AND A.id_posteur=$id_member ORDER BY N.date DESC LIMIT 0,10");
while($getNews = $getNewsQuery->fetch())
Merci à ceux qui pourront m'aider. ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

29 juin 2015, 11:43

Hello !

Je suis étonné que la condition "WHERE N.pseudo=A.id_membre" te retourne quelque chose :)

Pour les jointures, je te recommandes de mettre les conditions de jointures dans la liste des tables (FROM xxx JOIN yyy ON zzz) et de conserver le WHERE pour les critères de filtre des résultats.

Par contre je ne vois absolument pas de lien entre ta table notification et les autres, à moins que ta clé étrangère ne soit le pseudo du membre ?
Quelque chose comme ça ?
$sql = 'SELECT N.id, N.pseudo, N.titre, N.cible_action, DATE_FORMAT(N.date, '%d/%m/%Y à %Hh%imin') AS date
   , M.id, M.pseudo, M.avatar
   , A.id, A.id_posteur, A.id_membre 
FROM abonnement_membre A 
   JOIN membres M ON A.id_membre_suivi = M.id
   JOIN notification N ON M.pseudo = N.pseudo
WHERE A.id_posteur = ' . $id_member . '
ORDER BY N.date DESC 
LIMIT 0,10'

Nota : le mot clé "DATE" est un mot clé réservé du langage SQL il ne devrait pas être utilisé pour nommer une colonne ou servir d'alias. MySQL le tolère, ce n'est pas le cas des autres bases de données :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...