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