2016-02-12 1 views
-2

Comment obtenir le dernier message des conversations dans le système de messagerie? ie. écran d'accueil de (WhatsApp)SQL - Dernière conversation Liste des messages

J'ai créé cette procédure stockée mais impossible d'obtenir le résultat correct.

SELECT 
Max(msg.msgThread) as msgThread,    
Max(msg.msgId) AS msgId,    
Max(msg.msgDate) AS msgDate,    
min(DATEDIFF(MINUTE,msgCreatedDate,GETUTCDATE())) AS mintuesago,   
msgReceiverId,    
msgSenderId,       
max (msgmsg) as msg, --I am getting alpabatic max msg instead last msg. 
usr.umName,     
usr.umProfilePic   
FROM messages AS msg 
Inner Join usermaster AS usr ON ((msg.msgSenderId = usr.umId) 
or (msg.msgReceiverId = usr.umId)) 
WHERE 
--usr.umId=msg.msgReceiverId 
usr.umId!=3198 
and (msg.msgSenderId=3198 or msg.msgReceiverId =3198) 
GROUP BY usr.umName, usr.umProfilePic, msgReceiverId, msgSenderId, msgmsg 
--,msgSentById     
ORDER BY max(DATEDIFF(MINUTE,msgDate,GETUTCDATE())) 

avec cela, je peux obtenir la liste des utilisateurs, mais lorsque les deux utilisateur d'envoyer des messages à l'autre il donne deux lignes avec dernier message à la fois l'utilisateur.

+1

Tag dbms utilisés. (Beaucoup de SQL spécifique au produit là ...) – jarlh

+0

Je suggère de créer un Fiddle SQL qui a quelques données à titre d'exemple. Sans cela, il sera très difficile de répondre. http://sqlfiddle.com/ – jhilden

Répondre

1

Bien que cela soit difficile à résoudre sans aucune donnée et que vous soyez obligé de déduire la structure de votre table, il semble que l'ajout de msgThread à votre groupement empêchera les enregistrements en double provenant du même fil de messages. En sélectionnant top 1, vous obtiendrez uniquement l'enregistrement le plus récent (en supposant que votre clause order by fonctionne correctement).

Pour référence future: Si vous fournissez des exemples de données, expliquez ce que vous obtenez, et expliquez ce que vous voulez obtenir, il sera beaucoup plus facile de vous aider.

code non testé:

SELECT top 1 
msg.msgThread as msgThread,    
Max(msg.msgId) AS msgId,    
Max(msg.msgDate) AS msgDate,    
min(DATEDIFF(MINUTE,msgCreatedDate,GETUTCDATE())) AS mintuesago,   
msgReceiverId,    
msgSenderId,       
max (msgmsg) as msg, --I am getting alpabatic max msg instead last msg. 
usr.umName,     
usr.umProfilePic   
FROM messages AS msg 
Inner Join usermaster AS usr ON ((msg.msgSenderId = usr.umId) 
or (msg.msgReceiverId = usr.umId)) 
WHERE 
--usr.umId=msg.msgReceiverId 
usr.umId!=3198 
and (msg.msgSenderId=3198 or msg.msgReceiverId =3198) 
GROUP BY msgThread, usr.umName, usr.umProfilePic, msgReceiverId, msgSenderId, msgmsg 
--,msgSentById     
ORDER BY max(DATEDIFF(MINUTE,msgDate,GETUTCDATE()))