Выборка всех последних сообщений из всех диалогов - MySQL

Узнай цену своей работы

Формулировка задачи:

У меня есть таблица Message: Как мне выбрать все последние сообщения из диалогов. То есть из всех диалогов только 1 последнее сообщение - с наибольшей датой. Например для юзера с id = 4, есть 3 диалога с юзерамы с id=5,3,1. В диалоге между юзерами 5-4 будут сообщения (105), между юзерами 1-4 будут сообщения (103,102,101,100) ... Так вот, среди всех диалогов мне нужно выбрать все самые последние сообщения. В данном примере, это будут сообщения: 103,104,105. Еще есть дополнение,

если выйдет запрос для нахождения описанного выше

, то как еще сделать исключение для найденного списка. Например, есть массив-список с id пользователей сообщения от которых не должны показываться. Пусть там есть reject_id(12,5,21). Значит сообщение 105 не должно находится в запросе, т.к. его прислал пользователь с id=5.

Решение задачи: «Выборка всех последних сообщений из всех диалогов»

textual
Листинг программы
SELECT * FROM `Message`
WHERE id IN (
    SELECT max(id) as id FROM
        (SELECT id, fromUserId, toUserId FROM `Message` WHERE fromUserId =4
            UNION ALL
        SELECT id, toUserId, fromUserId FROM `Message` WHERE toUserId =4) t
    GROUP BY fromUserId, toUserId
)
ORDER BY id DESC

Объяснение кода листинга программы

В данном коде выполняется выборка всех последних сообщений из всех диалогов.

  1. Сначала мы выбираем максимальное значение id из таблицы Message, где fromUserId = 4 или toUserId = 4 (это диалоги, в которых участвует пользователь с id = 4).
  2. Затем мы группируем результаты по fromUserId и toUserId, чтобы получить уникальные диалоги.
  3. После этого мы выбираем все строки из таблицы Message, где id входит в список max(id), который мы получили на предыдущем шаге. Это гарантирует, что мы получим только последние сообщения из каждого диалога.
  4. Наконец, мы сортируем результаты по id в порядке убывания, чтобы получить последние сообщения в начале списка. Таким образом, данный запрос выбирает все последние сообщения из всех диалогов, в которых участвует пользователь с id = 4.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы