@entermix

Как правильно составить SQL запрос?

Хочу организовать групповые беседы, есть таблицы:

users // Пользователи
id, first_name, last_name

dialogs // Беседы
id, author_id, subject

dialogs_users // Участники беседы
dialog_id, user_id

dialog_messages // Сообщения диалога
id, dialog_id, user_id, text

message_views // Просмотры сообщений
id, message_id, user_id

Пользователь создает диалог, потом может пригласить туда несколько пользователей, при чтении сообщений, в таблицу message_views заносится соответствующая запись

Помогите пожалуйста составить SQL запрос для выборки всех диалогов пользователя (в которых он принимал участие), а так-же количества непрочитанных сообщений, где количество сообщений всего > 0

Это можно сделать 1 запросом?
  • Вопрос задан
  • 2401 просмотр
Пригласить эксперта
Ответы на вопрос 3
kawabanga
@kawabanga
dialogs
id, author_id, subject

dialogs_users
dialog_id, user_id

почему так? у диалога может быть несколько пользователей?
Ответ написан
JSinga
@JSinga
select d.subject, count( mv.message_id) from users u
inner join dialogs_users du on ( u.id = du.user_id)
inner join dialogs d on ( d.id = du.dialog_id)
inner join dialog_messages dm on ( dm.dialog_id = d.id and dm.user_id = u.id)
inner join message_views mv on ( mv.message_id = dm.id and mv.user_id = u.id)
where
u.id = ?
Having count( mv.message_id) > 0 --can delete in our case


Вместо вопроса подставлять нужный id user - а. Если нужно всех то просто уберите последнюю строку и добавьте вывод юзера в select.
Я склепал ответ из двух полей первое это тема диалога, 2 кол-во непрочтенных в этом диалоге, по сути должно работать хоть и выглядит жутко:)
Ответ написан
@rusitch
.NET Developer
SELECT d.*, (SELECT COUNT(1) FROM dialog_messages AS dm WHERE NOT EXISTS (SELECT * FROM message_views AS mv WHERE mv.message_id = dm.id AND user_id = <ПОЛЬЗОВАТЕЛЬ> ) WHERE dm.dialog_id = d.id ) AS messageCount
FROM dialogs AS d
INNER JOIN dialogs_users AS du ON du.dialog_id = d.id
WHERE user_id = <ПОЛЬЗОВАТЕЛЬ>
Ответ написан
Ваш ответ на вопрос

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

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