2016-04-09 4 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)) 
        ) 

У меня есть простая система обмена сообщениями, где сообщения 1 t 1 (без групп). Я просто хочу получить последнее сообщение между двумя пользователями.MySQL получить последние сообщения от 2 человек

Вышеупомянутые «работы», но я думаю, что я должен использовать максимальную временную метку против message_id, чтобы получить последнюю.

Моя таблица:

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

ответ

2

Вы можете не просто сделать это:

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

Почувствуйте себя, даже если это не совсем правильно, вы должны быть в состоянии использовать, имеющий положение здесь и устранить необходимость в подзапросе.

1

Ниже приводится решение с использованием correlated subquery, который отличается от исходного запроса (внутренний group by удаляется.

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

Это работает, но он возвращает последнее сообщение, отправленное каждому пользователю. Я хотел бы получить последнее сообщение обменивается между двумя пользователями. – ovg

+0

Обновлено ан. Пожалуйста, попробуйте, если он работает так, как вы ожидаете. –

Смежные вопросы