Выбор отдельных строк из таблицы, в которой 2 столбца имеют одинаковые внешние ключи (в обратном порядке) - PullRequest
0 голосов
/ 21 октября 2018

У меня есть таблица сообщений с полями id, время, isread, message, messagestatus, получатель и пользователь.Я хочу получить последнее сообщение (основанное на времени) пользователя с идентификатором 1, отправленного или полученного любым другим пользователям.

, например, если пользователь с идентификатором 1 (отправитель) отправляет сообщение пользователю сидентификатор 2 (получатель), и если пользователь с идентификатором 2 отправляет сообщение пользователю с идентификатором 1.

должно быть выбрано только самое последнее сообщение, отправленное между ними. Моя уже существующая таблица выглядит так:

enter image description here

я пыталсяSELECT * from (SELECT MAX(time) as time ,sender,receiver from message group by sender,receiver) as f where receiver=1 or sender=1 limit 20

, но он отображает только отправителя, получателя и время, в то время как другие столбцы, такие как message, id, messagestatus и read, опущены, плюс он не находит общее последнее сообщение, отправленное между двумя пользователями, а вместо этого находитсамое последнее сообщение, отправленное между user1 и другим пользователем, когда user1 является отправителем, а другой пользователь является получателем, а также находит последнее сообщение, когда user1 является получателем, а другой пользователь является отправителем.

1 Ответ

0 голосов
/ 21 октября 2018

Если вы хотите, чтобы самые последние сообщения были отправлены или получены пользователем «1», используйте фильтрацию, а не group by:

select m.*
from messages m
where 1 in (m.sender, m.receiver) and
      m.time = (select max(m2.time)
                from messages m2
                where (m2.sender = m.sender and m2.receiver = m.receiver) or
                      (m2.receiver = m.sender and m2.sender = m.receiver)
               );

Если два сообщения могут иметь одинаковую метку времени, то:

select m.*
from messages m
where 1 in (m.sender, m.receiver) and
      m.id = (select id
              from messages m2
              where (m2.sender = m.sender and m2.receiver = m.receiver) or
                    (m2.receiver = m.sender and m2.sender = m.receiver)
              order by m2.time desc, m2.id desc
              limit 1
             );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...