Как вывести последние диалоги пользователей?
Нужно сделать выборку всех последних сообщений (всего по одному от текущего пользователя), но не могу понять, как реализовать.
Имеется следующий алгоритм (предоставлен снизу), но не знаю как сделать в виде Eloquent laravel
?
Структура базы данных такова:
users['id', 'name', 'password']
messages['id', 'from_id', 'to_id','message']
Через LEFT JOIN
- В левой части - все
users
- В правой части - их
messages
- Сопоставление таблиц по
user_id
- Получается таблица всех сообщений всех пользователей.
Немного модифицируем запрос - messages
сортируем по message_id
в порядке убывания и берём только первую запись (через LIMIT
)
В итоге имеем то, что Вы и хотели - список всех пользователей с их последним сообщением.
Ответы (1 шт):
Автор решения: Oopss
→ Ссылка
https://www.mycompiler.io/view/FXf1j4kMNeV
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS messages;
create table if not EXISTS users(
id INTEGER PRIMARY KEY,
name text ,
password text
);
create table if not EXISTS messages(
id INTEGER PRIMARY KEY,
from_id INTEGER,
to_id INTEGER,
message Text
);
INSERT INTO users(name, password) VALUES
('Vasia','37'),
('Dasha','41'),
('Sasha','41'),
('Pasha','41'),
('Dan', '41'),
('Sam', '28');
SELECT 'Все пользователи';
SELECT * from users;
SELECT '----------------------------';
INSERT INTO messages(from_id, to_id, message) VALUES
('1', '2', 'Dasha hello!'),
('2', '1', 'Vasia norm'),
('4', '5', 'How are you?'),
('5', '6', 'Go'),
('4', '1', 'Fantastic!'),
('6', '1', 'No comment'),
('6', '2', 'Slowly'),
('6', '5', 'Dan, Dan ,Dan'),
('1', '2', 'WTF'),
('1', '2', 'Ok');
SELECT 'Последнее отправленное сообщение каждого пользователя';
SELECT m.id, m.from_id, m.to_id, m.message
FROM messages m
JOIN (
SELECT from_id, MAX(id) AS max_id
FROM messages
GROUP BY from_id
) latest ON m.from_id = latest.from_id AND m.id = latest.max_id;
SELECT '----------------------------';
SELECT 'Последнее полученное сообщение каждого пользователя';
SELECT m.id, m.from_id, m.to_id, m.message
FROM messages m
JOIN (
SELECT to_id, MAX(id) AS max_id
FROM messages
GROUP BY to_id
) latest ON m.to_id = latest.to_id AND m.id = latest.max_id;
SELECT '----------------------------';
SELECT 'Последнее сообщение каждого пользователя';
SELECT u.id as 'id', u.name as 'Пользователь', m.id AS message_id, m.to_id, m.message
FROM users u
LEFT JOIN (
SELECT m.from_id, m.id, m.to_id, m.message
FROM messages m
JOIN (
SELECT from_id, MAX(id) AS max_id
FROM messages
GROUP BY from_id
) latest ON m.from_id = latest.from_id AND m.id = latest.max_id
) m ON u.id = m.from_id
ORDER BY u.id;
Все пользователи
1|Vasia|37
2|Dasha|41
3|Sasha|41
4|Pasha|41
5|Dan|41
6|Sam|28
----------------------------
Последнее отправленное сообщение каждого пользователя
10|1|2|Ok
2|2|1|Vasia norm
5|4|1|Fantastic!
4|5|6|Go
8|6|5|Dan, Dan ,Dan
----------------------------
Последнее полученное сообщение каждого пользователя
6|6|1|No comment
10|1|2|Ok
8|6|5|Dan, Dan ,Dan
4|5|6|Go
----------------------------
Последнее сообщение каждого пользователя
1|Vasia|10|2|Ok
2|Dasha|2|1|Vasia norm
3|Sasha|||
4|Pasha|5|1|Fantastic!
5|Dan|4|6|Go
6|Sam|8|5|Dan, Dan ,Dan