如何根据其类型存储在多对多表中的类型来搜索电影

时间:2014-11-03 22:08:43

标签: mysql sql

我需要从表格movie获取所有列,其中genre.name =" action"

我有一张表genre,其中包含genre.id和genre.name

我有另一张表movie2genre,其中包含movieId和genreId

要按电影ID获取流派列表,我可以执行以下操作

SELECT name FROM movie2genre
JOIN Genre on Genre.id = movie2genre.GenreId 
JOIN Movie on Movie.id = movie2genre.MovieId 
WHERE Movie.id = 15664

但我不知道如何按流派名称

获取电影列表

例如,从类型为“动作”的电影中选择所有内容。或者'惊悚片'

编辑。

我需要一个适用于'action' OR 'thriller''action' AND 'thriller'

的查询

4 个答案:

答案 0 :(得分:0)

我错过了什么吗?

SELECT movie.name FROM movie2genre
JOIN Genre on Genre.id = movie2genre.GenreId 
JOIN Movie on Movie.id = movie2genre.MovieId 
WHERE Genre.Name ='Action'

<强>更新

要执行AND子句,请使用

      select name
from m
inner join mg on mg.movieid = m.movieid
inner join g on g.genreid = mg.genreid
where
g.genre = 'Action' or g.genre='Thriller'
group by name
having count(1) >= CASE WHEN OrClause then 1 else NumberOfGenresSupplied end

因此,在这种情况下,numberofGenresSupplied将等于2(您可以从提交的表单中获取此信息)。 如果你想要任何匹配的流派,OrClause将被设置为true,如果它必须匹配每个匹配的流派,则为false。

这将确保符合您的类型标准的不同电影列表。

答案 1 :(得分:0)

您可以使用WHERE子句来过滤类型,就像您在movieid上过滤一样。试试这个:

SELECT movie.name
FROM movie2genre
JOIN genre ON genre.id = movie2genre.genreid
JOIN movie ON movie.id = movie2genre.movieid
WHERE genre = 'action' OR genre = 'thriller';

修改 如果你想使用AND来获得两种类型,你可以做同样的连接,按照movieID分组并过滤2行。试试这个:

SELECT movie.name
FROM movie2genre
JOIN genre ON genre.id = movie2genre.genreid
JOIN movie on movie.id = movie2genre.movieid
WHERE genre = 'action' OR genre = 'thriller'
GROUP BY movie.id
HAVING COUNT(*) = 2;

答案 2 :(得分:0)

试试这个,它应该有效!


SELECT 
    m.* 
FROM 
    Movie m
    inner join movie2genre  mg on m.MovieId = mg.MovieId
    inner join Genre g         on g.GenreId = mg.GenreId 
WHERE
    g.name = 'action' or g.name='thriller'

答案 3 :(得分:0)

OR案例很简单,您可以将其作为许多已显示的联接或作为EXISTS进行。 AND情况很棘手,因为你必须出去检查两个不同的行。您可以使用两个exists子句。

和...

SELECT name 
FROM Movie 
Where 
EXISTS (
 select *
 from movie2genre 
 JOIN Genre on Genre.id = movie2genre.GenreId 
 where Movie.id = movie2genre.MovieId 
   and genre = 'action'
)
and
EXISTS (
 select *
 from movie2genre 
 JOIN Genre on Genre.id = movie2genre.GenreId 
 where Movie.id = movie2genre.MovieId 
   and genre = 'thriller'
)

... OR

SELECT name 
FROM Movie 
Where 
EXISTS (
 select *
 from movie2genre 
 JOIN Genre on Genre.id = movie2genre.GenreId 
 where Movie.id = movie2genre.MovieId 
   and genre in ('action', 'thriller')
)

另一种方法可能是计算有多少movie2genre匹配(使用OR方法)。如果该数字大于零,则满足OR。如果数字等于所有可能的类型,则也满足AND。