Получение идентификатора пользователя из базы данных SQL с несколькими таблицами

#mysql #sql #database #sqlite #ms-access

#mysql #sql #База данных #sqlite #ms-access

Вопрос:

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

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

введите описание изображения здесь

введите описание изображения здесь

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

Но некоторые способы отображения как пользователя 1, так и пользователя 2, но в списке нужен только пользователь 1.

Ответ №1:

Если вам нужны электронные письма пользователей, которые смотрели фильмы '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. Это сработает, но решение должно учитывать, что пользователь может посмотреть фильм более одного раза. У нас нет этой детали, но, скажем, человек купил бритвенные лезвия и ручку для бритвы, они могли покупать лезвия несколько раз, но не ручку. Итак, эта проблема никогда не указывалась в проблеме, но теоретически, поскольку пользователь мог видеть один и тот же фильм более 1 раза, и, таким образом, вы получаете 2, но они не видели два разных фильма.

Ответ №2:

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

Однако для типичных типов этого запроса опубликованные здесь решения завершатся неудачей, если пользователь увидит, скажем, 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')
 

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