2013-11-15 63 views
0

我有利用三个表的模式:排除值与子查询

  1. 演员名单和间隔actor_id电影片名的
  2. 列表和间隔movid_id
  3. 是编目两个这样的表如下面的一个:

    CREATE TABLE actors_movies (
    actor_movie_id INT AUTO_INCREMENT, 
    actor_id INT, 
    movie_id INT, 
    PRIMARY KEY (actor_movie_id), 
    KEY actor_id (actor_id), 
    KEY movie_id (movie_id) 
    ); 
    

我想编写一个查询,显示所有一个演员没有参与的电影。我遇到的问题是一部电影可能有多个演员。所以,即使你根据id或名字排除了演员,该电影仍然可以被拖入结果中。

我试图写下面的查询,但它有点多余和手动。我如何利用子查询来压制演员所在的电影,并将多个演员的问题考虑在内?

SELECT movie_name 
FROM movies as m 
JOIN actors_movies as am on m.movie_id = am.movie_id 
JOIN actors as a on a.actor_id = am.actor_id 
    WHERE actor_name <> 'actor_name' 
    AND am.movie_id NOT IN(4,14); 

任何帮助将不胜感激!

回答

1

这是一个LEFT OUTER的经典案例JOIN:

select movie_name 
from movies as m 
inner join actors_movies as am on m.movie_id = am.movie_id 
left outer join actors as a on a.actor_id = am.actor_id 
    and actor_name = 'actor_name' 
where a.actor_id is null; 
+0

我相信这就是我一直在寻找。谢谢! – user2356890