2013-10-27 93 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

我認爲這樣做的表現會更好,但你應該檢查/比較執行計劃 –