conseils messagerie

conseils messagerie - PHP - Programmation

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.  :hello:  
 
 

Reply

Marsh Posté le 11-05-2006 à 19:08:42   

Reply

Marsh Posté le 11-05-2006 à 19:26:52    

papanoramix a écrit :


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) ?


 
Par une jointure ? [:figti]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 11-05-2006 à 19:40:04    

heu oui, c'est a dire ?

Reply

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]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 11-05-2006 à 19:51:36    

ha ouais, je vais essayer les requetes muti tables, j'ai encore jamais fait.
merci

Reply

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  
 

Reply

Marsh Posté le 11-05-2006 à 23:20:17    

sielfried qui pond de la syntaxe de merde, c'est quoi ce délire ? :p
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]

Message cité 1 fois
Message édité par Djebel1 le 11-05-2006 à 23:24:15
Reply

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 ? :p


 
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. [:spamafote]  
 
Evidemment si la photo peut ne pas exister, faut du left join.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

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é :p
 
En plus c'est pas la syntaxe "normale" (même si c'est la syntaxe de la doc mysql, mais ça devrait pas :p)

Reply

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
 

Reply

Marsh Posté le 11-05-2006 à 23:40:41   

Reply

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.


Message édité par Djebel1 le 11-05-2006 à 23:46:49
Reply

Marsh Posté le 11-05-2006 à 23:46:20    

ok, merci, super

Reply

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).
 
En effet :
 
    * Les jointures faites dans la clause WHERE (ancienne syntaxe de 1986 !) ne permettent pas de faire la distinction de prime abord entre ce qui relève du filtrage et ce qui relève de la jointure.
    * Il est à priori absurde de vouloir filtrer dans le WHERE (ce qui restreint les données du résultat) et de voiloir "élargir" ce résultat par une jointure dans la même clause WHERE de filtrage.
    * La lisibilité des requêtes est plus grande en utilisant la syntaxe à base de JOIN, en isolant ce qui est du filtrage et de la jointure, mais aussi en isolant avec clarté chaque condition de jointures entre chaque couples de table.
    * L'optimisation d'exécution de la requête est souvent plus pointue du fait de l'utilisation du JOIN.
    * Lorsque l'on utilise l'ancienne syntaxe et que l'on supprime la clause WHERE a des fins de tests, le moteur SQL réalise le produit cartésiens des tables ce qui revient la plupart du temps à mettre à genoux le serveur !

Reply

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. [:figti]  
 
(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.)


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 12-05-2006 à 17:51:13    

t'as pas tort, c'est plus une question d'habitude qu'autre chose.


Message édité par Djebel1 le 12-05-2006 à 17:51:26
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed