2016-04-09 9 views
0
SELECT * 
FROM messages 
WHERE message_id IN (SELECT MAX(message_id) 
        FROM messages 
        GROUP BY if(sender_id > receiver_id, CONCAT(sender_id, receiver_id), CONCAT(receiver_id, sender_id)) 
        ) 

Ich habe ein einfaches Messaging-System, wo Nachrichten 1 t 1 (keine Gruppen) sind. Ich möchte nur die neueste Nachricht zwischen zwei Benutzern abrufen.MySQL erhalten die neueste Nachricht zwischen 2 Personen

Das obige 'funktioniert', aber ich denke, ich sollte den maximalen Zeitstempel vs message_id verwenden, um die neuesten zu bekommen.

Mein Tisch ist:

message_id (unique, auto inc), 
sender_id (Primary), 
receiver_id (Primary), 
time_date, 
content 

Antwort

2

Können Sie einfach nicht tun:

Select message_id from messages where sender = x and receiver = y having max (timestamp) group by message_id 

Fühlen Sie sich wie auch wenn das nicht ganz richtig Sie hier eine having-Klausel in der Lage verwenden sollte und beseitigen die brauchen für die Unterabfrage.

1

Das Folgende ist eine Lösung correlated subquery verwenden, die von Ihrer ursprünglichen Abfrage unterscheidet (die inneren group by entfernt wird.

SELECT * 
FROM messages as m1 
WHERE m1.time_date IN (SELECT MAX(time_date) 
        FROM messages as m2 
        WHERE (m1.sender_id = m2.sender_id and m1.receiver_id = m2.receiver_id) or 
          (m1.sender_id = m2.receiver_id and m1.receiver_id = m2.sender_id)  
        ) 
+0

Dies funktioniert, aber es gibt die letzte Nachricht jeden Benutzer gesendet. Ich möchte das erhalten Letzte Nachricht, die zwischen zwei Benutzern ausgetauscht wurde. – ovg

+0

Aktualisiert die Ans. Versuchen Sie es bitte, wenn es wie erwartet funktioniert. –