Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1321 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  conseils messagerie

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

conseils messagerie

n°1364573
papanorami​x
Posté le 11-05-2006 à 19:08:42  profilanswer
 

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:  
 
 

mood
Publicité
Posté le 11-05-2006 à 19:08:42  profilanswer
 

n°1364585
sielfried
Posté le 11-05-2006 à 19:26:52  profilanswer
 

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
n°1364593
papanorami​x
Posté le 11-05-2006 à 19:40:04  profilanswer
 

heu oui, c'est a dire ?

n°1364597
sielfried
Posté le 11-05-2006 à 19:43:26  profilanswer
 

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
n°1364601
papanorami​x
Posté le 11-05-2006 à 19:51:36  profilanswer
 

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

n°1364700
papanorami​x
Posté le 11-05-2006 à 22:52:23  profilanswer
 

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  
 

n°1364711
Djebel1
Nul professionnel
Posté le 11-05-2006 à 23:20:17  profilanswer
 

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
n°1364719
sielfried
Posté le 11-05-2006 à 23:31:50  profilanswer
 

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
n°1364720
Djebel1
Nul professionnel
Posté le 11-05-2006 à 23:37:06  profilanswer
 

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

n°1364723
papanorami​x
Posté le 11-05-2006 à 23:40:41  profilanswer
 

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
 

mood
Publicité
Posté le 11-05-2006 à 23:40:41  profilanswer
 

n°1364724
Djebel1
Nul professionnel
Posté le 11-05-2006 à 23:45:12  profilanswer
 

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
n°1364725
papanorami​x
Posté le 11-05-2006 à 23:46:20  profilanswer
 

ok, merci, super

n°1364726
Djebel1
Nul professionnel
Posté le 11-05-2006 à 23:48:01  profilanswer
 

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 !

n°1365345
sielfried
Posté le 12-05-2006 à 17:22:32  profilanswer
 

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
n°1365359
Djebel1
Nul professionnel
Posté le 12-05-2006 à 17:51:13  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  conseils messagerie

 

Sujets relatifs
[C] une messagerie instantanée simplequelques conseils
problème de lien de messagerieUML - Débutant en programmation - Recherche de conseils
J'aurais besoin de quelques conseils pour un site[java] serveur de messagerie instantanée
quelques conseils sur la securitéDemande de conseils pour SGBD
Besoin de conseils pour site web dynamiqueConseils classe php
Plus de sujets relatifs à : conseils messagerie


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR