Как правильно объединить сообщения в чатах с помощью запроса MySQL?

Здравствуйте! Можете ли вы помочь мне сделать правильный запрос в БД для группировки сообщений пользователей в таблице class_chat? У меня есть столбцы from_user_id, to_user_id, chat_id и msg. Мне нужно вывести все сообщения, удовлетворяющие четырем условиям:

1. from_user_id = 111 and to_user_id = 222 and chat_id = 1
2. to_user_id = 111 and from_user_id = 222 and chat_id = 1
3. from_user_id = 333 and to_user_id = 444 and chat_id = 2
4. to_user_id = 444 and from_user_id = 333 and chat_id = 2

Я хочу получить только два уникальных диалога, а не четыре записи. Можно ли это сделать без использования условия chat_id? Я не совсем понимаю, как это можно сделать.
  • 13 февраля 2024 г. 17:38
Ответы на вопрос 2
Да, вы можете объединить сообщения пользователей в таблице class_chat с помощью запроса MySQL, используя оператор UNION.

Вот пример запроса, который удовлетворяет вашим условиям и объединяет сообщения:

SELECT from_user_id, to_user_id, chat_id, msg
FROM class_chat
WHERE (from_user_id = 111 AND to_user_id = 222 AND chat_id = 1)
OR (to_user_id = 111 AND from_user_id = 222 AND chat_id = 1)
OR (from_user_id = 333 AND to_user_id = 444 AND chat_id = 2)
OR (to_user_id = 444 AND from_user_id = 333 AND chat_id = 2)
ORDER BY chat_id ASC;

Этот запрос объединяет все сообщения, удовлетворяющие указанным условиям. Результаты будут отсортированы по chat_id в возрастающем порядке.

Если вы хотите получить только уникальные диалоги, то можно использовать оператор DISTINCT:

SELECT DISTINCT chat_id, from_user_id, to_user_id, msg
FROM (
    SELECT from_user_id, to_user_id, chat_id, msg
    FROM class_chat
    WHERE (from_user_id = 111 AND to_user_id = 222)
    OR (to_user_id = 111 AND from_user_id = 222)
    OR (from_user_id = 333 AND to_user_id = 444)
    OR (to_user_id = 444 AND from_user_id = 333)
) AS subquery
ORDER BY chat_id ASC;

Этот запрос выбирает только уникальные диалоги, игнорируя повторяющиеся значения chat_id. Результаты также будут отсортированы по chat_id в возрастающем порядке.
GROUP BY GROUP_CONCAT для объединения сообщений в одну строку, упорядоченную по времени т.е если у тебя есть поле timestamp или msg_time если ты не хочешь использовать chat_id, то можно попробовать сделать следующий запрос 

GROUP BY chat_id - таким образом, строки с одинаковым chat_id будут объединены в одну группу

"Функция LEAST выбирает минимальное из значений. Значениями могут выступать поля, а также строки и числа"
"Функция GREATEST выбирает максимальное из значений / помогает упорядочивать пары пользователей"

Комбинация LEAST и GREATEST гарантирует уникальность групировки чатов игнорируя порядок пар пользоваталей чатов.
Вобщем есть набросок, дальше можно уже самому накидать и поиграться.
Похожие вопросы