Я бы сказал что-то вроде левого присоединения таблицы пользователей к видимой таблице (и присоединения этой таблицы к таблице фильмов).
(отредактировал код из-за комментария от MatBailie)
Добавьте ограничения списка в предложении JOIN (а не в предложении WHERE, как указал мне MatBailie), и вы получите что-то вроде (код ниже должен работать на SQL-Server, но что-то подобное должно работать дляMySql также):
SELECT COUNT(Users.ID)
FROM Users
LEFT JOIN Seen ON Users.ID = Seen.UserID AND Users.something IN (list)
LEFT JOIN Movies ON Seen.MovieID = Movie.ID AND Movies.something IN (list)
WHERE Movies.ID IS NULL
GROUP BY User.ID -- <-- This is probably optional
Но так как обычно есть несколько способов получить один и тот же результат, скорректированная версия моего предыдущего ответа:
SELECT COUNT(Users.ID)
FROM Users
LEFT JOIN Seen ON Users.ID = Seen.UserID
LEFT JOIN Movies ON Seen.MovieID = Movie.ID
WHERE (Users.something IN (list) OR Users.something IS NULL)
AND (Movies.something IN (list) OR Movies.something IS NULL)
AND Movies.ID IS NULL
GROUP BY User.ID -- <-- This is probably optional
Третья попытка: получить всех пользователей-идс в списке, которые видели один из фильмов.Затем, получите все идентификаторы в списке и вычтите идентификаторы, которые видели один из этих фильмов.Знайте, что для больших наборов данных (пара тысяч невелика) этот запрос может стать медленным.Чтобы проверить это, я удалил «userid = 2 и movieid = 3» из списка увиденных, иначе я не получил бы результат.Теперь я вижу, что Ник не видел ни одного из первых трех фильмов (ссылаясь на ваш пример rextester)
SELECT *
FROM musers
WHERE musers.id IN (1,2,3)
AND musers.id NOT IN (
SELECT musers.id
FROM musers
JOIN Seen ON musers.ID = Seen.UserID
JOIN Movies ON Seen.MovieID = movies.ID
WHERE movies.id IN (1,2,3) )