powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Чат личных сообщений
22 сообщений из 22, страница 1 из 1
Чат личных сообщений
    #39973733
azlab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача очень типична и думаю имеет десяток разных реализаций. Вот и мне на проекте понадобилась простые личные сообщения, т.е. простенький чат с двумя участниками. Вот как я сделал таблицу:

user_id
sender_id
text
isread
date_create

Максимально просто и все хорошо работает, но ест одна проблема. Помимо текста юзеру надо показать панельку с чатами в которых он принимает участие с другими пользователями. И отобразить их надо в хронологическом порядке (самый свежий чат вверху) и конечно показать сколько в этом чате непрочитанных. Как это сделать одним запросом?

С одной стороны - нужна сортировка по убыванию даты создания сообщения, с другой стороны - группировка по id юзера (или user_id или sender_id). Какое есть хорошее решение, в плане что запрос будет достаточно быстрым для большого количества записей в таблице?

Проект разрабатывается, поэтому поменять структуру - нет проблем. Единственное что не хотелось бы - уходить от одной таблицы.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39973748
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azlab
Какое есть хорошее решение

Отказаться от совершенно дебильного условия "одним запросом".
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39973765
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azlab
user_id
sender_id
а кто из них тот, кому нужно показать результат запроса?
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39973805
azlab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, А сколько надо? Мне кажется это можно решить одним запросом, но пока я не понял как, допускаю что может я ошибаюсь и одним никак, собственно это и хотел узнать.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39973807
azlab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, Любой из, просто в зависимости от роли текущего пользователя - будет суммирование непрочитанных меняться (т.е. мне не нужно знать сколько непрочитанных сообщений которые отправил я, но нужно знать сколько новых отправили мне).
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39973814
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версию MySQL озвучьте, а?
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39973847
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azlab
но нужно знать сколько новых отправили мне
Ну так кто из этих двух полей я?
Как нам догадаться какой смысл вы вкладываете в название user_id ?
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39973913
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
azlab
но нужно знать сколько новых отправили мне
Ну так кто из этих двух полей я?
Как нам догадаться какой смысл вы вкладываете в название user_id ?
Вангую, что user_id - это текущий пользователь системы, а sender_id - это его собеседник(и).

to azlab: у чата = группы сообщений должен быть единый для них идентификатор. Если оставаться в рамках одной таблицы, то первое сообщение должно получать идентификатор чата (например, можно использовать числовое представление даты-времени на сервере, вычислять порядковый номер запросом, прикрутить UUID), а далее все последующие сообщения ветки в момент инсерта записи получают один и тот же идентификатор, присвоенный первому сообщению. Отбор сообщений осуществляется группировкой по идентификатору чата.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39973919
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azlab
А сколько надо?

Столько, сколько сможете без появления тормозов на сервере.

azlabПомимо текста юзеру надо показать панельку с чатами в которых он принимает участие с другими пользователями. И отобразить их надо в хронологическом порядке (самый свежий чат вверху) и конечно показать сколько в этом чате непрочитанных.
Один запрос на текст, второй на чаты включая количество непрочитанных сообщений. Но если вы хотите, чтобы оно было динамическим, тогда чаты - отдельно, количество отдельно.

Итого два-три запроса минимум.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974000
azlab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, 5.7
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974001
azlab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
azlab
но нужно знать сколько новых отправили мне
Ну так кто из этих двух полей я?
Как нам догадаться какой смысл вы вкладываете в название user_id ?


user_id - получатель сообщения
sender_id - отправитель
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974002
azlab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у чата = группы сообщений должен быть единый для них идентификатор. Если оставаться в рамках одной таблицы, то первое сообщение должно получать идентификатор чата (например, можно использовать числовое представление даты-времени на сервере, вычислять порядковый номер запросом, прикрутить UUID), а далее все последующие сообщения ветки в момент инсерта записи получают один и тот же идентификатор, присвоенный первому сообщению. Отбор сообщений осуществляется группировкой по идентификатору чата.

Да, я думал над этим, т.к. два поля user_id создают сложности. Пожалуй так и сделаю, спасибо.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974003
azlab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Один запрос на текст, второй на чаты включая количество непрочитанных сообщений. Но если вы хотите, чтобы оно было динамическим, тогда чаты - отдельно, количество отдельно.

Итого два-три запроса минимум.


Я видимо плохо объяснил, но задача только на вывод списка чатов: дальше юзер кликает по одному из юзеров - и отдельным запросом получаем список всех сообщений. Одним запросом имелось ввиду получить список чатов выстроенных в убывающем порядке с подсчитанным числом непрочитанных сообщений
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974010
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azlab
user_id - получатель сообщения
sender_id - отправитель
Интересно, как вы будете выходить их положения, если количество участников чата выйдет за рамки двух. Так или иначе, проще сделать 3 таблицы.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974041
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azlab , для версии 5.7 - читайте FAQ: Выборка первой/последней записи в группах .

Группа - это
Код: sql
1.
2.
WHERE @current_user_name IN (user_id, sender_id)
GROUP BY CASE WHEN user_id = @current_user_name THEN sender_id ELSE user_id END


а сортировка - по date_create.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974042
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck99
Интересно, как вы будете выходить их положения, если количество участников чата выйдет за рамки двух.
А какая разница? задача-то не стоИт отобразить участников чата - в постановке чётко сказано, что надо только сами чаты и количество непрочитанных сообщений.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974155
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Gluck99
Интересно, как вы будете выходить их положения, если количество участников чата выйдет за рамки двух.
А какая разница? задача-то не стоИт отобразить участников чата - в постановке чётко сказано, что надо только сами чаты и количество непрочитанных сообщений.
В задаче сказано, что чаты надо отделить друг от друга (я так это истолковал). Сейчас фактически обмен сообщениями представляет собой одну ветку (глобальный чат) из абстрактного рута. Когда у вас сообщения жестко не объединены в группы, объединить их пользователями по вашей технологии можно только в частном случае, когда присутствуют два (или несколько заранее известных) участника. А если их тысячи и нужен гибкий уровень изоляции? Я предполагаю, что это понадобится, потому что автор упомянул большое количество записей в таблице. Вряд ли пользователей будет два, если учесть, что это может быть чат, например, технической поддержки или что-то в этом роде.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974170
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azlab
Одним запросом имелось ввиду получить список чатов выстроенных в убывающем порядке с подсчитанным числом непрочитанных сообщений

Тогда это простой count(not isread) from ... group by чат order by имя desc.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974175
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
azlab
Одним запросом имелось ввиду получить список чатов выстроенных в убывающем порядке с подсчитанным числом непрочитанных сообщений
Тогда это простой count(not isread) from ... group by чат order by имя desc.
Не совсем простой, там еще дата должна фигурировать, а она не даст группировать. Т.е. надо MIN/MAX(date_create) добавлять. Да и поля "чат" у автора нет, его еще нужно создать.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974494
azlab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
azlab , для версии 5.7 - читайте FAQ: Выборка первой/последней записи в группах .

Группа - это
Код: sql
1.
2.
WHERE @current_user_name IN (user_id, sender_id)
GROUP BY CASE WHEN user_id = @current_user_name THEN sender_id ELSE user_id END


а сортировка - по date_create.


Спасибо, вроде то что нужно в итоге.
Финальный запрос получился такой:

Код: sql
1.
2.
3.
4.
5.
SELECT user_id, sender_id, SUM(IF(user_id = 1 AND isread = 0,1,0)) AS unread 
FROM message_direct
WHERE 1 IN (user_id, sender_id)
GROUP BY CASE WHEN user_id = 1 THEN sender_id ELSE user_id END
ORDER BY date_insert DESC 



(1 - id текущего юзера, который на выводе нужно проигнорить, т.к. нет чата с самим собой)
Получаем список в нужном порядке и известно число непрочитаных.
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974527
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azlab
который на выводе нужно проигнорить, т.к. нет чата с самим собой
Не надо. Или у тебя есть записи, где и user_id, и sender_id равны 1?
...
Рейтинг: 0 / 0
Чат личных сообщений
    #39974848
azlab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
azlab
который на выводе нужно проигнорить, т.к. нет чата с самим собой
Не надо. Или у тебя есть записи, где и user_id, и sender_id равны 1?


Именно потому что нет - и буду игнорить. Результат - массив IDs собеседников, т.е. или текущий юзер начал беседу или его собеседник, но в итоге - мне нужно показать список ТОЛЬКО собеседников, т.к. чата с самим собой нет. А по клику на пункт из списка подгружается переписка.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Чат личных сообщений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]