Я пытаюсь получить адрес электронной почты для пользователя, где человек должен смотреть определенное количество фильмов. Например, если пользователь посмотрел фильм 1,2 и 3, когда я запустил запрос для фильма 3, этот пользователь должен появиться в моей таблице. Но когда пользователь имеет соответствие всем критериям, например, когда я запускаю запрос для пользователя, смотрите фильмы 1,2,3 и 4, этот пользователь не должен отображаться.

Вот две таблицы:

enter image description here

enter image description here

SELECT Email 
From Users
Inner Join Movies On Users.ID = Movies.ID
Where(Movies = "Movie 1" AND Movies = "Movie 2")

Но кое-как, как и Пользователь 1, и Пользователь 2, появляются, но ему нужен только Пользователь 1 в списке.

1
user3072224 18 Апр 2019 в 18:12

2 ответа

Лучший ответ

Если вам нужны электронные письма пользователей, которые смотрели фильмы 'Movie1' и 'Movie2', вы можете сделать это:

select u.email
from users u inner join movies m
on m.id = u.id
where m.movies in ('Movie1', 'Movie2')
group by u.email
having count(*) = 2

Если есть случай, когда пользователь видел фильм более одного раза, измените:

having count(*) = 2

С участием:

having count(distinct m.movies) = 2 
1
forpas 19 Апр 2019 в 08:25

Здесь есть несколько рабочих решений.

Однако для типичных типов этого запроса опубликованные здесь решения не будут выполнены, если пользователь увидит, скажем, Movie1 два раза. И скажем, на веб-сайте пользователь мог бы купить бритвенные лезвия несколько раз, но мы хотим бритвенные лезвия и рукоятку бритвы.

Таким образом, исходная проблема не устанавливает и не указывает, мог ли пользователь смотреть один и тот же фильм более одного раза, но в качестве вопроса Q + A такого ограничения не было наложено на вопрос, и, таким образом, с помощью логики мы можем законно предположить, что это возможно.

В результате мой "воздушный" sql был бы таким:

SELECT id, [Name], Email
FROM tblNames
WHERE [Name] is in
   (select [Name] from tblMovies where Movies = 'Movie 1')
   AND
 [Name] is in
        (select [Name] from tblMovies where Movies = 'Movie 2')

С учетом вышеизложенного, пользователь мог видеть любой фильм много раз, но для того, чтобы вышеописанное работало, ему нужно будет увидеть и то, и другое. Таким образом, использование счетчика на самом деле потерпит неудачу, поскольку здесь нет ничего, что могло бы указывать на то, что пользователи не могут смотреть один и тот же фильм много раз.

1
Albert D. Kallal 18 Апр 2019 в 23:19