Я попробую это на макушке головы, так что ожидайте некоторых проблем с синтаксом, но идея заключается в следующем.
Вы можете отфильтровать тех, у кого нет расписания событий, используя левое соединение. При левом соединении элементы второй части запроса будут показаны как нулевые.
select * from users u
left join events e on e.user_id = u.id
where e.user_id is null
Теперь я не думаю, что это самый эффективный способ, но простой способ поиска всех, у кого есть 3 или менее сообщений:
select * from users u
left join events e on e.user_id = u.id
where u.id in (
select COUNT(*) from messages m where m.user_id = u.id HAVING COUNT(*)>3;
)
and e.user_id is null
Тогда проще всего отфильтровать, кто не админ: D
select * from users u
left join events e on e.user_id = u.id
where u.id in (
select COUNT(*) from messages m where m.user_id = u.id HAVING COUNT(*)>3;
)
and e.user_id is null
and u.admin = false
Надеюсь, это поможет.