2017-10-05 1 views
0

Entwickeln von Benutzerchats in einer Web-App.MySQL Query zum Anzeigen des Chatverlaufs zwischen angemeldetem Benutzer und anderen Benutzern

Ziel: Liste der Benutzer in Desc-Reihenfolge anzeigen, mit denen der eingeloggte Benutzer einen Chat hatte und in der Nähe jedes Benutzers - die letzte Nachricht (entweder von diesem Benutzer oder vom angemeldeten Benutzer).

Aktuelle MySQL-Abfrage:

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 

gut funktioniert. Aber! Für einen Chat eines beliebigen Benutzers A mit einem beliebigen Benutzer B zeigt die aktuelle Anfrage zwei Zeilen an: eine mit der neuesten Nachricht, die von Benutzer A an Benutzer B gesendet wurde, und eine letzte Nachricht von Benutzer B an Benutzer A. Während ich eine Zeile brauche (Unter einer "Zeile" verstehe ich eine Bootstrap-Zeile mit Daten, wobei Spalte 1 das Symbol des Benutzers ist, mit dem der Chat stattfindet, Spalte 2 ist die letzte Nachricht zwischen diesen 2 Benutzern und Spalte 3 ist die Zeit der letzten Nachricht.

Allerdings sollte die Anforderung, dass die Benutzer eine Anzeige und Benutzer B hatte einen Chat, und dies nur einmal angezeigt werden, mit dem die letzte Nachricht, die zwischen Benutzer A und B.

mein Gehirn über sie durchgebrannt. Ich möchte die Frage kurz halten und fühlen, dass ich in der Nähe bin, aber kann dieses Problem nicht lösen. Danke für jeden Hinweis!

+0

Versuchen Sie, so etwas wie 'und user_to> user_from' in der inneren Abfrage die Symmetrie zu brechen –

Antwort

0

Sie können versuchen, diese und die user_id mit dem aktuellen angemeldeten Benutzer-ID ersetzen und versuchen dann

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 
Verwandte Themen