Для пользователя 5 вы хотите последнюю строку для каждого пользователя. Другой пользователь:
case when sender_id = 5 then receiver_id else sender_id end
Полный запрос:
select *
from chat
where (sender_id = 5 or receiver_id = 5)
and (case when sender_id = 5 then receiver_id else sender_id end, message_date_time) in
(
select
case when sender_id = 5 then receiver_id else sender_id end as other_user,
max(message_date_time)
from chat
where sender_id = 5 or receiver_id = 5
group by case when sender_id = 5 then receiver_id else sender_id end
);
Начиная с MySQL 8.0, вы можете использовать ROW_NUMBER
вместо того, чтобы ранжировать свои записи для другого пользователя по дате и времени.
select *
from
(
select
chat.*,
row_number() over (
partition by case when sender_id = 5 then receiver_id else sender_id end
order by message_date_time desc, id desc) as rn
from chat
where sender_id = 5 or receiver_id = 5
) ranked
where rn = 1;