2017-10-05 3 views
0

Développement de la discussion utilisateur dans une application Web.Requête MySQL pour afficher l'historique de discussion entre l'utilisateur connecté et les autres utilisateurs

Objectif: afficher la liste des utilisateurs dans l'ordre décroissant avec lequel l'utilisateur connecté a eu une conversation et à proximité de chacun de ces utilisateurs - le dernier message (écrit par cet utilisateur ou l'utilisateur connecté).

requête MySQL actuelle:

SELECT id, 
     user_to, 
     user_from, 
     body, 
     msg_time 
FROM chat 
WHERE id IN (SELECT MAX(id) 
      FROM chat WHERE user_to=:id 
      OR user_from=:id 
      GROUP BY user_to,user_from) 
ORDER BY msg_time DESC 

fonctionne bien. Mais! Pour une conversation de tout utilisateur A avec un utilisateur B, la requête en cours affiche 2 lignes: une avec le message le plus récent envoyé par l'utilisateur A à l'utilisateur B, et un message le plus récent envoyé par l'utilisateur B à l'utilisateur A. sous une "ligne" je veux dire une ligne de données bootstrap, où la colonne 1 est l'icône de l'utilisateur avec lequel le chat a lieu, la colonne 2 est le dernier message entre ces 2 utilisateurs et la colonne 3 est l'heure de ce dernier message).

Cependant, la demande doit afficher que l'utilisateur A et l'utilisateur B a une conversation, et afficher uniquement cette fois, le message le plus récent fait entre l'utilisateur A et B.

Blown mon cerveau au-dessus. Je veux garder la question courte et sentir que je suis proche, mais ne peux pas enfin résoudre celui-ci. Merci pour tout conseil!

+0

essayer d'ajouter quelque chose comme 'et user_to> user_from' dans la requête interne pour briser la symétrie –

Répondre

0

vous pouvez essayer cela et remplacer le user_id avec l'utilisateur connecté actuel ID utilisateur et puis essayez

SELECT id, 
    user_to, 
    user_from, 
    body, 
    msg_time 
    FROM chat 
WHERE id IN (SELECT MAX(id) 
     FROM chat WHERE user_to=:id 
     OR user_from=:id 
GROUP BY IF (`user_from`=:user_id, `user_to`,`user_from`)) 
ORDER BY msg_time DESC