Получить последнее сообщение в разговоре между двумя пользователями в postgresql - PullRequest
0 голосов
/ 25 сентября 2018

Я пишу систему обмена сообщениями и пытаюсь найти последние сообщения в каждом диалоге для данного пользователя (id = 46).Вот что у меня сейчас есть:

SELECT sender, receiver, MAX(created_at) maxDate 
FROM message 
WHERE sender = 46 OR receiver = 46 
GROUP BY sender, receiver; 

Что выводит:

45  46  2018-09-24 21:14:47
46  45  2018-09-24 21:10:32
46  1   2018-09-24 21:08:47
46  25  2018-09-23 22:25:09

Проблема в том, что разговор между 45 и 46 - это один разговор, но он дает две строки врезультат, потому что каждый человек отправлял сообщения друг другу.

Я хотел бы вместо этого получать только последнее сообщение из всего диалога, поэтому я бы как-то изменил SQL, чтобы вместо этого получить следующее:

45  46  2018-09-24 21:14:47
46  1   2018-09-24 21:08:47
46  25  2018-09-23 22:25:09

Другая строка была отброшена, потому что в их разговоре 45 отправило самое последнее сообщение.

Я некоторое время бился об это и не могу понять это.

Ответы [ 2 ]

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

Я думаю, что самый быстрый способ сделать это будет

SELECT GREATEST(sender, receiver), LEAST(sender, receiver), MAX(created_at) AS maxdate
FROM t
WHERE sender = 46
  OR receiver = 46 
GROUP BY GREATEST(sender, receiver), LEAST(sender, receiver);

Или вы можете попробовать с DISTINCT ON

SELECT DISTINCT ON(GREATEST(sender, receiver), LEAST(sender, receiver)) GREATEST(sender, receiver), LEAST(sender, receiver),  created_at AS maxdate
FROM t
WHERE sender = 46
  OR receiver = 46 
ORDER BY GREATEST(sender, receiver), LEAST(sender, receiver), created_at DESC;
0 голосов
/ 25 сентября 2018

Вот один из методов:

SELECT m.*
FROM message m 
WHERE 46 IN (m.sender, m.receiver) AND
      (LEAST(m.sender, m.receiver), GREATEST(m.sender, m.receiver), created_at) IN 
       (SELECT LEAST(m2.sender, m2.receiver), GREATEST(m2.sender, m2.receiver), MAX(m2.created_at)
        FROM message m2
        GROUP BY LEAST(m2.sender, m2.receiver), GREATEST(m2.sender, m2.receiver)
       );

Здесь - реекстер, иллюстрирующий логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...