MySQL - список разговоров - PullRequest
       1

MySQL - список разговоров

0 голосов
/ 31 марта 2020

Как и в популярных системах обмена сообщениями.

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

В моем следующем SQL утверждении: Двоичное поле read = 1 означает, что получатель прочитал сообщение. Если текущий пользователь не прочитал какое-либо сообщение, которое он получил, тогда весь этот разговор показывается как непрочитанный текущему пользователю. Но текущий пользователь не должен знать, прочитал ли другой человек сообщение, отправленное текущим пользователем. Двоичное поле delto = 1 означает, что получатель удалил сообщение, отправитель все равно будет иметь сообщение; аналогично для delfrom. Соединение с таблицей пользователей для получения имен пользователей.

Предположим, что текущий идентификатор пользователя равен 2. Я хочу что-то вроде этого:

select userid, name, latest- сообщение-беседа, отметка времени последнего сообщения-разговора, бит_и (если (to = 2, read, b'1 ')) как read из messages присоединиться users (to = 2 и delto = b'0 'и from = userid) или (from = 2 и delfrom = b'0' и to = userid) сгруппировать по userid упорядочить по макс (messid) des c

Соответствующие поля, но вы можете игнорировать:

create table `users`(
`userid` mediumint unsigned not null auto_increment primary key,
`name` tinytext not null
);

create table `messages`(
`messid` int unsigned not null auto_increment primary key,
`from` mediumint unsigned not null,
`to` mediumint unsigned not null,
`message` text not null,
`time` datetime default CURRENT_TIMESTAMP,
`read` bit(1) not null default b'0',
`delfrom` bit(1) not null default b'0',
`delto` bit(1) not null default b'0'
);

1 Ответ

0 голосов
/ 31 марта 2020

Я нашел решение. Так как у меня были проблемы с агрегацией message и time, я вывел их за пределы запроса select. Ну, time можно было бы агрегировать как max (time), но зачем это делать, когда max (messid) уже агрегирует сообщения. Итак, вот решение, которое я нашел:

выберите userid, name, message, time, conversations. read из (выберите максимум (messid) как mmid, userid, name, bit_and (если (to = 2, read, b'1 ')) как read из messages присоединиться users вкл (to = 2 и delto = b'0 'и from = userid) или (from = 2 и delfrom = b'0' и to = userid) в порядке userid mmid des c) как conversations присоединиться messages к messid = mmid

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