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
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 ) ...
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
__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.
__construct(){
I'm alive now
}
__construct(){
I'm alive now
}
__construct(){
I'm alive now
}
__construct(){
I'm alive now
}