Решил сделать у себя на сайте систему как групповых диалогов, так и приватных. Пока что реализовал только приватные, то есть общение двух пользователей друг с другом.
Максим Ворожцов, получить диалоги, в которых состоят оба юзера:
SELECT `dialog_id` FROM `dialogs_users` WHERE `user_id` = '1' AND `dialog_id` IN (
SELECT `dialog_id` FROM `dialogs_users` WHERE `user_id` = '2'
)
и посложнее получить диалоги, в которых состоят только они:
SELECT `dialogs_users`.`dialog_id`
FROM `dialogs_users`
-- отсекаем диалоги где `users_count` НЕ <= 2
INNER JOIN
(
SELECT `dialog_id`, COUNT(`user_id`) as `users_count`
FROM `dialogs_users`
GROUP BY `dialog_id`
HAVING `users_count` <= 2
) `t` ON `t`.`dialog_id` = `dialogs_users`.`dialog_id`
-- между юзером с id 1
WHERE `user_id` = '1'
-- и юзером с id 2
AND `dialogs_users`.`dialog_id` IN (
SELECT `dialog_id` FROM `dialogs_users` WHERE `dialogs_users`.`user_id` = '2'
)
Чтобы последний запрос был быстрее и проще, нужна избыточность данных — хранить кол-во юзеров в диалоге напрямую.