У меня есть следующая структура базы данных обмена сообщениями
DB - User
id_user - name - last_name
1 A A
2 B B
3 C C
4 D D
5 E E
Сообщения БД сохраняются в следующей структуре
id - from - to - message - date
1 1 2 msg(here) (date here)
2 2 1
3 1 2
4 4 1
5 4 1
6 1 5
мне нужна помощь, чтобы сделать SQL-запрос, чтобы вернуть мне последний разговор Idependete, если отправлено или получено
Exmeplo результаты, необходимые для разговора пользователя 1
id - from - to ...
3 1 2
5 4 1
6 1 5
то есть искать независимое последнее сообщение, отправленное или полученное, если не повторить про заказ других и получить имя и фамилию в таблице пользователей для отображения на экране
конечный результат на экране
mensagens
name last_name mensagem
b b mensagem
d d mensagem
e e mensagemSELECT distinct * FROM menssage inner join user on from = id_user where to LIKE '$session'
union SELECT distinct * FROM message inner join user on to = id_user where from LIKE '$session'
group by id_user order by id asc
Логика проста: вы создаете набор данных как UserID (имея оба из & чтобы в нем), дата & сообщение. так что у вас есть данные для всех отправленных & полученные сообщения в едином наборе данных.
— Теперь жизнь довольно проста, просто оцените ее по дате & выбрал последнее 1 сообщение для этого пользователя & показать его с его именем, Lname & сообщение 🙂
Пример кода для PostgreSQL.
create table DBuser (userid int, name char(10), last_name char(20));
insert into DBuser values(1, 'A', 'LA');
insert into DBuser values(2, 'B', 'LB');
insert into DBuser values(3, 'C', 'LC');
insert into DBuser values(4, 'D', 'LD');
insert into DBuser values(5, 'E', 'LE');
select * from DBUsercreate table DBMessages (id int, Ufrom int, Uto int, message text, Mdate time);
insert into DBMessages values (1, 1, 2, 'Hello 1', CURRENT_time);
insert into DBMessages values (2, 2, 1, 'Hello 2', CURRENT_time);
insert into DBMessages values (3, 1, 2, 'Hello 3', CURRENT_time);
insert into DBMessages values (4, 4, 1, 'Hello 4', CURRENT_time);
insert into DBMessages values (5, 4, 1, 'Hello 5', CURRENT_time);
insert into DBMessages values (6, 1, 5, 'Hello 6', CURRENT_time);
select * from DBMessages;
select name,
last_name,
message
from DBuser,
(select userID,
message,
rank() over (PARTITION BY userID order by Mdate desc) as rank
from (select Ufrom as userID,
message,
Mdate
from DBMessages
union all
select Uto as userID,
message,
Mdate
from DBMessages
) as data
) as rankeddata
where rank =1
and rankeddata.userID = DBUser.userid;
Name Last_Name Message
"A" "LA" "Hello 6""B" "LB" "Hello 3""D" "LD" "Hello 5""E" "LE" "Hello 6"
Других решений пока нет …