Structure bdd messagerie

Discussion dans 'Administration d'un site Web' créé par sigma2008, 11 Janvier 2015.

  1. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    Bonjour,
    J'ai un site avec des utilisateurs, je veux créer une messagerie affin que les utilisateurs puissent se contacter avec un simple message. J'ai donc créé une table comme ceci :

    id --------- idposteur -------------- idrecepteur----------- message ------------- date

    avec :

    idposteur : c'est l'ID de la personne qui a envoyé le message,
    idrecepteur : la personne qui a recu le message,

    Maintenant par exemple quand jozef ouvre la page mesmessage, je dois afficher les personnes avec qui il a communiqué et c'est la le problème, je vaiss avoir toute la liste des message alors que je veux juste afficher les personne avec qui il a communiqué.

    Bon, si je dois penser plus pour trouver une solution pour l'affichage je souhaite avoir votre avie sur la structure et si vous avez une structure bien améliorée.

    merci
     
  2. loubet
    loubet WRInaute impliqué
    Inscrit:
    19 Février 2003
    Messages:
    792
    J'aime reçus:
    0
    tu fais 2 requetes, une qui retourne les infos des personnes, avec idposteur=iddejozef, l'autre qui retourne les infos des personnes, avec idrecepteur=iddejozef
     
  3. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    jusqu'ici tout va bien mais imagine si :
    - Jozef a envoyé 10 message à MOI
    - Moi a envoyé 8 messages à Jozef

    - Moi a envoyé 3 message à Christine
    -Christine a envoyé 7 messages à moi

    Dans la page mes messages j'aurais 2 div, le premier contient un lien vers ma discussion avec Jozef et le deuxième div contient ma discussion avec Christine.

    mais avec ton code ça m'affiche plusieurs div chaque div contient un message (total nombre de messages échangé) alors que c'est pas une page d'affichage de message mais de discussions globale avec les personnes, une fois je clique sur une discussion avec Christine par exemple là j'aurais mes messages avec christine, là je gère
     
  4. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 192
    J'aime reçus:
    1
    Pas forcement > GROUP BY ou DISTINCT.

    En imaginant que tu veuille deux div :

    * Une pour les conversations où tu dois répondre
    le message d'id le plus élevé avec id utilisateur == idrecepteur
    genre : select idrecepteur from table where idrecepteur = (ton id) group by idposteur order by date

    * Une autre pour les conversations ou tu as répondu
    le message de l'id le plus élevé avec id utilisateur == idposteur
    genre : select idrecepteur from table where idposter = (ton id) group by idrecepteur order by date
     
  5. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    Ah merci zeb je connais pas le group by, et si je veux afficher les deux * dans le même div genre un div pour la discusssion entre idposteur et MOI

    Genre : select idposteur and idrecepteur from table where idposteur =(mon id) and idrecepteur == (mon id) group by idposteur and idrecepteur

    Car il y a 3 cas :
    1- on ma envoyé un message et j'ai pas répondu, dans ce cas (mon id) existe que dans idrecepteur
    2- j'ai envoyé un message et on ma pas répondu, dans ce cas (mon id) existe que dans idposteur
    3- on a dicuté ensemble (passage de messages entre les deux) (dans ce cas (mon id) existe dans idposteur et idrecepteur
     
  6. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    Je pense que ça a marché avec (group by idposteur and idrecepteur)
     
  7. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    ousps ça ne marche pas, voila j'explique clairement :

    [​IMG]

    voila je veux regrouper tout ce qui est en rouge : idsender = (mon id) and idrecver = (mon id)
    Ce qui va me donner une seule ligne :)

    Une idée ?

    merci
     
  8. longo600
    longo600 WRInaute passionné
    Inscrit:
    24 Février 2005
    Messages:
    2 209
    J'aime reçus:
    7
    Bonjour,

    je travailles dans un autre environnement de BDD (4D), mais il me semble que ta structure ne correspond pas a ce que tu aimerais avoir.

    Si j'ai bien compris, tu aimerais recréer une ID de conversation en faisant des recherches et rapprochement par id de message(en fait par idsender et idrecever). Quelques soit 'id ou le champ, tu cherche plutot à faire un regroupement par "sujet" (ou conversation) en somme, mais c'est manquant...

    Tu ne gagnerais pas en simplicité en ajoutant un champ ID_conversation? Ainsi, que tu soit seul (émeteur ou receveur), deux, trois ou 4 etc … ca simplifierais non? De plus, à la longue, il te faudra limiter de toute manière l'affichage, et ca risque d'être difficile de t'y retrouver dans tous les messages, avec un tel ou un tel, le sujet, etc...

    Avec se nouveau champ, tu regroupe d'un coup l'ensemble. Une selection vers tableau et en 1 milliseconde, tu as le détail classé par date.

    C'est juste une idée comme ça en parcourant le sujet ...
     
  9. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    merci pour votre réponse longo600, si j'ajoute un champs, je vais mettre quoi qui me facilite le groupement ?
     
  10. longo600
    longo600 WRInaute passionné
    Inscrit:
    24 Février 2005
    Messages:
    2 209
    J'aime reçus:
    7
    Dans une table relationnelle, l'idéal serait d'avoir 2 tables

    Table_conversation ;
    -> champ_ID (numérique)
    -> sujet (texte) (on peu incrémenter ce champ par exemple de la derniere réponse, ou d'un sujet de son choix)
    ->date_crea (date)
    ->date_modif (date)
    ->cloture (booleen)
    ->priorite


    Table_message
    ->ID
    ->id_conversation (lien)
    ->id_sender
    ->id_receipt
    ->date (selon le format fusionnable avec H)
    ->heure
    ->nom_sender
    ->nom_recept
    ->lu_part_recept (booleen)
    ->Date_H_lu
    ->message
    ->priorite (booleen)

    Dans mon environnement ca donne:

    Code:
    CHERCHER([Table_conversation]; [Table_conversation]cloture=faux)
    TRIER([Table_conversation]priorite;>;[Table_conversation]date_modif;<)
    puis gérer l'affichage avec une boucle par exemple, mais il y a plusieurs manière de faire cela

    pour faire simple (toujours dans mon environnement)

    Code:
    //Déclarations
    TABLEAU TEXTE($Tab_sujet;0)
    TABLEAU DATE($Tab_date_modif;0)
    $RC:=caractère(retour_chariot)
    //
    // on cree 2 tableaux selon la sélection 
    SELECTION VERS TABLEAU([Table_conversation]sujet;$Tab_sujet;[Table_conversation]date_modif;$Tab_date_modif)
    
    $montexte_final:="DATE | SUJET | DERNIER_MESSAGE"+$RC
    
    BOUCLE($i;1;taille tableau($Tab_date_modif))
    CHERCHER([Table_message];[Table_message]id_conversation=[Table_conversation]champ_ID)
    TRIER([Table_message]Date;<) // donc on est positioné sur le message le plus récent
    SI([Table_message]lu_part_recept=vrai)
    montexte_final:= montexte_final+chaine($Tab_date_modif{$i})+" | "+$Tab_sujet{$i}+" | "+[Table_message]message+$RC
    SINON
    montexte_final:= montexte_final+chaine($Tab_date_modif{$i})+" | "+$Tab_sujet{$i}+" | <strong>"+[Table_message]message+"</strong>"+$RC
    FIN DE SI
    FIN DE BOUCLE
    tu peux entourer le champ "[Table_message]message" d'un lien qui va par exemple t'ouvrir un pop-up avec la liste triée de tous les messages de cette conversation. Dans cette approche, tu as déjà la dernière réponse, elle peut te suffire.

    C'est d'ailleurs un peu comme un forum, en simplifié ...

    C'est une idée ...
     
  11. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    c'est très bien expliqué merci beaucoup, une nouvelle table facilite beaucoup le tavail certes, mais les autres sites utilisent une seule table (tel que j'ai montré en haut), le seul hic c'est d'afficher la lite des discussions :(
     
  12. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 022
    J'aime reçus:
    291
  13. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    non j'ai pas parlé de la suppression j'ai mon astuce pour la suppression, je vais faire comme facebook le message sera caché pour le premier utilisateur s'il le supprime si le deuxième supprime le meme message il sera complètemnet supprimé.
     
  14. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 192
    J'aime reçus:
    1
    Une piste qui marche pour un utilisateur donné (éventuellement l'id du gars connecté)
    Soit la table :
    [​IMG]

    Code:
    SELECT recever, GROUP_CONCAT(id) as convers FROM `aaa_test` 
    WHERE (sender = 1 OR recever = 1) GROUP BY (sender*recever)
    L'idée c'est de sélectionner les messages ou l'utilisateur est l’émetteur ou le destinateur (id=1 ci dessus) en groupant sur un critère unique pour une conversation (ici le produit de leur id respectif qui ne peut être que unique pour les convers d'un utilisateur donnée). de plus en agrégeant les id tu as accès a l'ensemble des messages d'une conversation entre deux personnes (ici c'est formalisé par la collone "convers" qui est le fruit de "GROUP_CONCAT(id) as convers").

    exemple pour l'utilisateur 1
    [​IMG]
    exemple pour l'utilisateur 3
    [​IMG]
     
  15. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    Ah merci beaucoup zeb c'est plus claire merci pour votre temps :( j'ai donc utilisé ceci et ça marche parfaitement mais j'ai pas trop testé :

    Code:
    $ens= "SELECT * from message where idrecever='$id' or idsender='$id' group by (idsender * idrecever) order by id desc";
    [code]
    
    vous pensez que ça fait l'affaire ?
     
  16. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 192
    J'aime reçus:
    1
    oui ça fonctionne sauf que tu récupère des trucs inutiles comme id et message qui ne correspondent a rien de pertinent pour une conversation. Group_concat(id) lui en revanche te donne tous les id de message d'une convers ça peut être utile avec un explode()
     
  17. Bool
    Bool WRInaute passionné
    Inscrit:
    26 Février 2004
    Messages:
    1 546
    J'aime reçus:
    0
    Attention GROUP_CONCAT est bridée par défaut à 1024 caractères (cf group_concat_max_len), et sur le principe aura toujours une limitation en taille. Donc quand on s'en sert, il faut être absolument certain qu'on récupérera tous les enregistrements qu'on voulait.
     
  18. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    Moi je veux juste récupérer 200 caractères du dernier message @Bool :) merci pour l'information.

    Zeb oui ça va m'aider je vais l'utiliser, mais une question, Group_Contact elle regroupe les messages et met une virgule à coté de chaque message, si on utilise explode, imagine qu'un message contient déjà une virgule ?
     
  19. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    Dernier truc que je vous demande et je vous remercie beaucoup, c'est comment récupérer le début d'une chaine de caractère avant la virgule ','

    Merci
     
  20. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 192
    J'aime reçus:
    1
    GROUP_CONCAT est pas trop adapté a l'agrégation de contenu texte en fait, pour le point que tu soulève (présence de virgules) et aussi pour la remarque que fait bool sur la taille limite du blob retourné.

    Quoi qu'il en soit essaye ta requête sans le GROUP_CONCAT et vérifie que c'est bien le dernier message qui est retourné et si ce n'est pas le cas ajoute une order by pour assurer le coup.

    Pour ne prendre que X caractères dans une chaine utilise substr() en php ou directement dans la requêtes SQL.
     
  21. sigma2008
    sigma2008 WRInaute impliqué
    Inscrit:
    18 Juin 2008
    Messages:
    775
    J'aime reçus:
    5
    Sujet résolu merci beaucoup zeb

    GROUP_CONCAT(message order by id desc)
     
  22. longo600
    longo600 WRInaute passionné
    Inscrit:
    24 Février 2005
    Messages:
    2 209
    J'aime reçus:
    7
    La messagerie est destinée a recevoir un petit ou un grand nombre de messages et d'utilisateurs différents?
     
Chargement...
Similar Threads - Structure bdd messagerie Forum Date
WordPress Refonte des catégories, structure et format des URL, redirections 301 Référencement Google 17 Juillet 2020
Données Structurées : FAQ / QA sur plusieurs pages ? Techniques avancées de référencement 9 Juillet 2020
Xenforo est-il un outil de création de forum adapté aux petites structures Demandes d'avis et de conseils sur vos sites 20 Avril 2020
Données structurées page par page Problèmes de référencement spécifiques à vos sites 1 Avril 2020
WordPress Structure du site et référencement sur WP Développement d'un site Web ou d'une appli mobile 27 Mars 2020
impact sur référencement si données structurées manquantes par gg Crawl et indexation Google, sitemaps 6 Mars 2020
WordPress Description et avis sur la même page : Structure Hn différentes ?? Débuter en référencement 6 Février 2020
Comment faire une structure en silo avec un menu de navigation ? Référencement Google 4 Février 2020
"Structure d'une expression clé" Débuter en référencement 17 Janvier 2020
Restructurer mon site suite à un audit RM Tech Demandes d'avis et de conseils sur vos sites 14 Janvier 2020
  1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
    Rejeter la notice