MySQL выбрать одну строку, появляющуюся несколько раз - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть строка чата, и я хочу получить одну строку из нескольких (последняя строка предпочтительнее).

База данных выглядит так ...

This is the image of the messages in that database row

Мне нужно получить последний разговор (DISTINCT) между пользователем и другими и отобразить в наборе записей

Один результат на пользователя, с которым мы общались.

Вот что у меня есть на данный момент:

select sender_id,receiver_id,message, count(*) 
  from chat 
  where (`sender_id` = '5' OR `receiver_id` = '5') 
  group by receiver_id, sender_id 
  HAVING count(*) > 1;

Спасибо.

1 Ответ

0 голосов
/ 10 сентября 2018

Для пользователя 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...