2013-10-27 92 views
0

我试图找到包含2或其中演员的所有电影的列表。查询数据库查询与关系表相交的记录列表

select title from Movie where movieID in(
    select movieID 
    from Cast 
    join MovieHasCast 
     on Cast.castID = MovieHasCast.castID 
    where cast.name = 'gene wilder' 
intersect 
    select movieID 
    from Cast 
    join MovieHasCast 
     on Cast.castID = MovieHasCast.castID 
    where cast.name = 'richard pryor') 

我的选择将是这样的:

select title from Movie where movieID in(
    select movieID 
    from Cast 
    join MovieHasCast 
     on Cast.castID = MovieHasCast.castID 
    where cast.name = 'gene wilder' 
    and movieID in (
     select movieID 
     from Cast 
     join MovieHasCast 
      on Cast.castID = MovieHasCast.castID 
     where cast.name = 'richard pryor')) 

这只是我如何实现这一点的样本。但是,我在C#中动态构建这个查询,以按流派,演员等过滤电影列表。我关注性能。

这是完成此任务的最佳方式吗?我觉得有一个更好的方法来做到这一点我只是不知道如何尤其是因为用户可以选择10个演员成员,并且该查询将开始变得非常大 - 即使它可能会返回0记录。

+1

你可以张贴一些示例数据又该结果是什么?如果我拒绝你的权利只是一个单一的查询与一群将做 –

+0

@JorgeCampos有15K +演员成员我无法发布他们,但是可以放心这两个查询确实返回正确的结果,这是一个名单,其中理查德先生和基因怀尔德明星在他们 – Kairan

+0

是的,我只是要求一个例子,像每个表的3行。但我认为@TI答案是你想要的 –

回答

1

尝试

select movie.name 
from movie 
join moviehascast mc on mc.movieid = movie.id 
join cast on cast.id = mc.castid 
where cast.name in (@actor1, @actor2) 
group by movie.name 
having count(1) = @numberOfActorsSearched 
+0

谢谢 - 这似乎是我正在寻找的“简单”的选择。你认为在这方面的表现是否比我发布的其他两种解决方案少? – Kairan

+1

我认为这样做的表现会更好,但你应该检查/比较执行计划 –