2013-09-17 2 views
0

У меня есть 3 таблицы: Movies, Actors и MovieActors. MovieActors многие-ко-многим из Movies и Actors с колоннами MovieActorId, MovieId и ActorIdSQL select on a many-to-many table

Как найти фильмы, которые имеют определенный набор актеров в нем? Например, я хочу найти все фильмы, в которых есть как Майкл Фассбендер (актер Id 1), так и Брэд Питт (актер Id 2). Как выглядит запрос?

+0

Jay, я бы, вероятно, не столкнулся с колонкой MovieActorID в третьей таблице. В текущем дизайне один и тот же актер может быть назначен одному и тому же фильму несколько раз. Просто используйте таблицу с двумя столбцами. MovieID/ActorID. – dcaswell

+1

. Фактически это упрощение фактической таблицы, в которой у актеров может быть несколько ролей. Подумайте фильмы Тайлера Перри. –

ответ

1

Чтобы сохранить его простым, вы можете просто сделать два in положения:

select * from Movies m 
where m.MovieId in (select MovieId from MovieActors where ActorId = 1) 
and m.MovieId in (select MovieId from MovieActors where ActorId = 2) 

производительность может быть не так хорошо, как один join, но это чистый и легко читать.

5

Один из способов - присоединиться к столам. Фильтр для актеров, а затем обеспечить подсчет имеет ряд актеров вы хотите в нем (2 в данном случае)

SELECT 
    m.MovieID 
FROM 
    Movies m 
    INNER JOIN MovieActors ma 
    ON m.MovieID = ma.MovieID 

WHERE 
    ma.ActorID IN (1,2) 
GROUP BY 
    m.MovieID 
HAVING COUNT(DISTINCT ma.ActorID) = 2 

DEMO

Примечание

Благодаря user814064 для указания на то, что так как актеры могут иметь более одной роли в фильме, нам нужно считать DISTINCT ma.ActorID не только * Демоверсия SQL Fiddle демонстрирует разницу

+0

Не могли бы вы объяснить 'count = 2'? – enapupe

+0

Просто запустил это на моем сервере, и он дает мне фильмы, в которых нет второго актера. –

+0

@JaySun Можете ли вы предоставить образцы данных или даже лучше SQL Fiddle, которые показывают это? –

2
select m.movieid 
from movies m 
inner join movieactors ma on ma.movieid = m.movieid 
where ma.actorid in (1,2) 
group by m.movieid 
having count(distinct ma.actorid) = 2