conseils messagerie - PHP - Programmation
Marsh Posté le 11-05-2006 à 19:26:52
papanoramix a écrit : |
Par une jointure ?
Marsh Posté le 11-05-2006 à 19:43:26
select m.message, u.nom, p.photo
from messages m, membres u, photos p
where m.expediteur = u.id and p.idmembre = u.id
and m.id = [id_message]
Marsh Posté le 11-05-2006 à 19:51:36
ha ouais, je vais essayer les requetes muti tables, j'ai encore jamais fait.
merci
Marsh Posté le 11-05-2006 à 22:52:23
ok, c'est génial, ça fonctionne bien, mais j'ai un petit soucis: comment faire pour qu'il aille quand meme me chercher les infos du membre meme s'il n'a pas de photo ?
voilà ma requete initiale:
SELECT m.*, p.photo FROM membres m, photos p WHERE m.id=p.id_membre
Marsh Posté le 11-05-2006 à 23:20:17
sielfried qui pond de la syntaxe de merde, c'est quoi ce délire ?
pour les mecs sans tofs, faut un left join : (ou un right join dans l'autre sens pour devancer les tatillons)
select m.message, u.nom, p.photo
from membres as u
left join photos as p
on p.idmembre = u.id
inner join messages as m
on m.expediteur = u.id
where m.id = [id_message]
Marsh Posté le 11-05-2006 à 23:31:50
Djebel1 a écrit : sielfried qui pond de la syntaxe de merde, c'est quoi ce délire ? |
Euh, les jointures classiques (virgule) ça revient au même qu'un inner join a priori, donc si y'avait forcément une photo par membre, ça marche très bien.
Evidemment si la photo peut ne pas exister, faut du left join.
Marsh Posté le 11-05-2006 à 23:37:06
>ça revient au même qu'un inner join a priori
seulement à priori, même si l'optimiseur MySQL bosse bien, dois y avoir moyen de trouver une jointure tordue qui fera que ça sera pas optimisé
En plus c'est pas la syntaxe "normale" (même si c'est la syntaxe de la doc mysql, mais ça devrait pas )
Marsh Posté le 11-05-2006 à 23:40:41
ok, merci, mais est ce que vous pouvez expliquer rapidement ce qu'est ce left join ? je n'ai pas trouvé pour l'instant sur le net
Marsh Posté le 11-05-2006 à 23:45:12
un bon tuto :
http://sql.developpez.com/sqlaz/jointures/
left join va rechercher tous les enregistrements satisfaisant la condition de jointure (ici on p.idmembre = u.id), puis rajouter toutes les lignes de la table de gauche qui ne satisfont pas la condition de jointure.
Donc ici ça va te ramener tous les membres avec photos, puis ramener tous les membres sans photos.
Tu peux faire pareil avec right join en inversant l'ordre des tables : ça va ramener toutes les lignes statisfaisant la condition de jointure, puis rajouter toutes les lignes de la table de droite qui ne statisfont pas la condition de jointure.
Marsh Posté le 11-05-2006 à 23:48:01
tiens d'ailleurs, pour rebondir sur la syntaxe :
Citation : Dans la mesure du possible, utilisez toujours un opérateur de jointure normalisé Sql2 (mot clef JOIN). |
Marsh Posté le 12-05-2006 à 17:22:32
Y'a que le point 4 qui me paraît réellement pertinent dans cette liste, en admettant que MySQL n'optimise pas tout seul (même dans les dernières versions) ce qui m'étonne pas mal. En tout cas la doc dit que c'est "sémantiquement équivalent", donc bon.
(En termes de styles et de facilité de lecture, c'est plus subjectif et je préfère personellement rester aux jointures "à l'ancienne" quand c'est possible, ça me paraît plus naturel et logique (ce n'est qu'une condition particulière), et il suffit de mettre les jointures en premier dans le where, pour rendre ça parfaitement clair à mes yeux.)
Marsh Posté le 12-05-2006 à 17:51:13
t'as pas tort, c'est plus une question d'habitude qu'autre chose.
Marsh Posté le 11-05-2006 à 19:08:42
Bonjour,
alors j'aurai besoin de quelques conseils.
En fait j'ai créé un systeme de messagerie sur mon site.
il existe une table "membres" avec l'id, le nom etc
j'ai aussi une table "messages" qui contient l'id de l'expéditeur, le message etc
et pour terminer une table "photos" avec l'id du membre ainsi que sa photo.
Mon probleme est que quand je veux afficher les messages d'un membre, je voudrais aussi afficher le nom des expéditeurs ainsi que leur photo.
Donc le pseudo du membre ne se trouve que dans une table, la photo dans une autre. Seuls les id sont partout.
Comment effectuer cela le plus simplement et le moins lourdement possible (le minimum de requetes) ?
Est ce qu'il vaut mieux que j'enregistre le pseudo en meme temps que le message ou la photo ?
Ou je garde cette structure de tables, mais dans ce cas quelles seraient les grandes boucles a effectuer ?
je suppose qu'il y a pas mal de personnes qui ont été confrontées a ce probleme, merci de me faire part de votre expérience.