Задать вопрос
@admin089

Как вывести крайние диалоги пользователей?

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

структура базы такова:

users['id', 'name', 'password']

messages['id', 'from_id', 'to_id','message']
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
kawabanga
@kawabanga
В общем ключе вот так -
SELECT * FROM
(SELECT max(id) as maxId, from_id 
GROUP BY from_id
WHERE from_id in (1,2,3)
ORDER BY maxId desc
) as t1
INNER JOIN messages m on t1.maxId = m.id


ЧатГПТ Laravel далее код сгенерировал, выглядит корректно. Заметьте, что первую часть запроса в любом случае выполнять через Query Builder, но можно вывести ее в получение конкретных id последних сообщений. И дальше двумя, можно отдельными запросами уже через модель - получить данные по сообщениям и пользователям. Они будут работать по первичным ключам и срабатывать моментально.
А можно просто добавить жадную загрузку по связи Users на втором запросе, что в целом облегчит вам задачу и не нужно будет связывать далее сообщение и его автора.
// Подзапрос для получения maxId и from_id
$subQuery = (new Query())
    ->select(['maxId' => 'MAX(id)', 'from_id'])
    ->from('messages')
    ->where(['from_id' => [1, 2, 3]])
    ->groupBy('from_id')
    ->orderBy(['maxId' => SORT_DESC]);

// Основной запрос с INNER JOIN
$query = (new Query())
    ->select('*')
    ->from(['t1' => $subQuery])
    ->innerJoin('messages m', 't1.maxId = m.id');

// Выполнение запроса
$results = $query->all();
Ответ написан
Комментировать
BasiC2k
@BasiC2k
.NET developer (open to job offers)
Через LEFT JOIN
В левой части - все users
В правой части - их messages
Сопоставление таблиц по user_id
Получается таблица всех сообщений всех пользователей.
Немного модифицируем запрос - messages сортируем по message_id в порядке убывания и берём только первую запись (через LIMIT)
В итоге имеем то, что Вы и хотели - список всех пользователей с их последним сообщением.
PS Чистый SQL не привожу, т.к. предварительно потребуется его отладка. Но при понимании SQL составить запрос для Вас будет не проблема.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы