Пользователь создает диалог, потом может пригласить туда несколько пользователей, при чтении сообщений, в таблицу message_views заносится соответствующая запись
Помогите пожалуйста составить SQL запрос для выборки всех диалогов пользователя (в которых он принимал участие), а так-же количества непрочитанных сообщений, где количество сообщений всего > 0
entermix:
>почему так? у диалога может быть несколько пользователей?
я думал в dialogs хранится только автор диалога, тема диалога и id
а в dialogs_users все участники
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 кол-во непрочтенных в этом диалоге, по сути должно работать хоть и выглядит жутко:)
JSinga:
>count( mv.message_id) > 0
Запрос не проверял, но это по идее лишнее. Со связью INNER, если нет сообщений то и в выборку не попадет. По идее.
Что скажете?
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 = <ПОЛЬЗОВАТЕЛЬ>
Запрос:
"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` = 1 ) 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` = 1"
выдает ошибку:
"#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `dm`.`dialog_id` = `d`.`id` ) AS `messageCount` FROM `dialogs` AS `d` INNE' at line 1 "