Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete SQL pour afficher les conversations

Sujet résolu
    9 septembre 2020 à 21:06:16

    Salut je suis actuellement confronté  à un probleme et pas un des plus mince

    J'ai une table messagerie et une autre utilisateurs

    la table messagerie contient les colonnes suivantes: id,envoi,recoit,message,datemsg

    la table utilisateurs contient : nom,prenom,email,pict

    Dans la table messagerie les colones envoi et recoit stockent respectivement les addresses emails de l'expediteur et du recepteurs

    Mon soucis est que je veux

    "SELECTIONNER LES MESSAGES OU INTERVIENT LA PERSONNE EN SESSION EN LES REGROUPANT PAR PERSONNES INTERPOSEES AVEC LE DERNIER MESSAGE EN DATE AVEC UNE JOINTURE AVEC LA TABLE UTILISATEURS POUR AFFICHER LE NOM ET LE PRENOM  DES INTERLOCUTEURS A LA PERSONNE EN SESSION"

    Pour ce faire j'effectue la requete suivante mais elle ne marche pas

    SELECT M.*,
    U.nom AS sender_nom,
    U.prenom AS sender_prenom,
    U.pict AS sender_pict,
    U2.nom AS receiver_nom,
    U2.prenom AS receiver_prenom,
    U2.pict AS receiver_pict
    FROM messagerie M 
    LEFT JOIN utilisateurs U ON M.envoi = U.email 
    LEFT JOIN utilisateurs U2 ON M.recoit = U2.email
    WHERE
    (M.envoi = 'session_email' AND NOT M.recoit= 'session_email') 
    OR
     (M.recoit = 'session_email' AND NOT M.envoi = 'session_email' )
    ORDER BY MAX(M.id) DESC

    Le soucis c'est que j'arrive pas a fait le groupement par personne interposé

    -
    Edité par GillesKpanou 9 septembre 2020 à 21:20:10

    • Partager sur Facebook
    • Partager sur Twitter

    __construct(){

    I'm alive now

    }

      10 septembre 2020 à 9:07:15

      Bonjour,

      Qu'appelles tu "personne interposée" ? Un exemple ?

      Au passage utiliser l'adresse email pour la jointure n'est pas très pertinent. L'id utilisateur eut été préférable...

      -
      Edité par Benzouye 10 septembre 2020 à 9:07:34

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        10 septembre 2020 à 21:41:00

        Désolé pour l'attente et merci pour avoir taillé importance à mon sujet

        Par personne interposée, je suggere par là, l'interlocuteur de la personne en session

        • Partager sur Facebook
        • Partager sur Twitter

        __construct(){

        I'm alive now

        }

          10 septembre 2020 à 21:53:09

          Donc je souhaite ainsi regroupé les messages pur en faire des conversations
          • Partager sur Facebook
          • Partager sur Twitter

          __construct(){

          I'm alive now

          }

            10 septembre 2020 à 22:23:42

            Il faut faire une sous-requête pour déterminer le dernier message par interlocuteur.

            Si l'on peut s'appuyer sur l'id du message pour déterminer le plus récent (c'est plus facile et efficace qu'avec la date), ce serait :

            -- Derniers messages par correspondant
            SELECT
            	IF( envoi = 'session_email', recoit, envoi ) AS email,
            	MAX( id ) AS id
            FROM messagerie
            WHERE
            	M.envoi = 'session_email'
            	OR M.recoit = 'session_email'
            GROUP BY IF( envoi = 'session_email', recoit, envoi )

            Ensuite, tu peux utiliser cela dans une requête principale pour récupérer tout ce que tu veux :

            SELECT
            	S.nom AS sender_nom,
            	S.prenom AS sender_prenom,
            	S.pict AS sender_pict,
            	IF( S.email = 'session_email', 'Envoyé à', 'Reçu de' ) AS sens,
            	R.nom AS receiver_nom,
            	R.prenom AS receiver_prenom,
            	R.pict AS receiver_pict,
            	M.message,
            	M.datemsg
            FROM
            	(
            		-- Derniers messages par correspondant
            		SELECT
            			IF( envoi = 'session_email', recoit, envoi ) AS email,
            			MAX( id ) AS id
            		FROM messagerie
            		WHERE
            			M.envoi = 'session_email'
            			OR M.recoit = 'session_email'
            		GROUP BY IF( envoi = 'session_email', recoit, envoi )
            	) DM
            		INNER JOIN messagerie M
            			ON DM.id = M.id
            		INNER JOIN utilisateur S
            			ON M.envoi = S.email
            		INNER JOIN utilisateur R
            			ON M.recoit = R.email
            ORDER BY M.datemsg DESC

            Une autre façon de faire, avec UNION :

            SELECT
                S.nom AS sender_nom,
                S.prenom AS sender_prenom,
                S.pict AS sender_pict,
                IF( S.email = 'session_email', 'Envoyé à', 'Reçu de' ) AS sens,
                R.nom AS receiver_nom,
                R.prenom AS receiver_prenom,
                R.pict AS receiver_pict,
                M.message,
                M.datemsg
            FROM
            	(
            		SELECT email, MAX( id )
            		FROM
            			(
            				SELECT recoit AS email, MAX( id ) AS id
            				FROM messagerie
            				WHERE envoi = 'session_email'
            				GROUP BY recoit
            				UNION
            				SELECT envoi AS email, MAX( id ) AS id
            				FROM messagerie
            				WHERE recoit = 'session_email'
            				GROUP BY envoi
            			) U
            		GROUP BY email
            	) DM
                    INNER JOIN messagerie M
                        ON DM.id = M.id
                    INNER JOIN utilisateur S
                        ON M.envoi = S.email
                    INNER JOIN utilisateur R
                        ON M.recoit = R.email

            Je ne sais pas laquelle sera la plus performante selon ton contexte ...

            Au passage, je renouvelle :

            Benzouye a écrit:

            utiliser l'adresse email pour la jointure n'est pas très pertinent. L'id utilisateur eut été préférable...

            Si tu peux encore modifier cela ... Tu peux toujours ajouter un id auto incrémenté, et mettre une contrainte UNIQUE( email ) ...

            -
            Edité par Benzouye 10 septembre 2020 à 22:31:17

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              11 septembre 2020 à 19:32:02

              OK je prendrai l'email comme clé unique et l'id pour clé primaire

              Merci pour ta participation

              Le code marche correctement

              Encore une fois merci

              -
              Edité par GillesKpanou 11 septembre 2020 à 20:08:39

              • Partager sur Facebook
              • Partager sur Twitter

              __construct(){

              I'm alive now

              }

              Requete SQL pour afficher les conversations

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown