-1

我正在尝试解决 SQLzoo 中 JOIN 教程的问题 13 ( http://sqlzoo.net/wiki/More_JOIN_operations )

问题要求列出“朱莉·安德鲁斯”出演的所有电影的片名和男主角。

我已经制作了以下脚本,但有些地方是错误的。

SELECT title, actor.name FROM
  movie JOIN casting ON movie.id=movieid
        JOIN actor ON actor.id=actorid
    WHERE ord=1
    AND title = ALL
      (SELECT title FROM 
         movie JOIN casting ON movie.id=movieid
               JOIN actor ON actor.id=actorid
           WHERE actor.name='Julie Andrews')
4

7 回答 7

1

正确的脚本是:

SELECT m.title,
       a.name
FROM   movie m
       JOIN casting c
         ON m.id = c.movieid
            AND c.ord = 1
       JOIN actor a
         ON a.id = c.actorid
WHERE  m.id IN (SELECT m1.id
                FROM   movie m1
                       JOIN casting c1
                         ON m1.id = c1.movieid
                       JOIN actor a1
                         ON a1.id = c1.actorid
                WHERE  a1.name = 'Julie Andrews')  

我注意到,如果我在 WHERE 语句中使用列 m.title 作为代理,则脚本需要更多时间来运行并且 SQLzoo 服务器会停止它。相反,使用 m.id 列可以加快加载速度。也许是一种好的做法,如果可能的话,总是更喜欢检查数字而不是字母。

我初始脚本的另一个问题是设置一个 EQUAL 运算符而不是 IN。子查询返回多于 1 行,因此必须使用 IN 运算符。

于 2013-08-17T11:51:24.143 回答
1

尝试这个 :

SELECT title, name
  FROM movie, casting, actor
  WHERE movieid=movie.id
    AND actorid=actor.id
    AND ord=1
    AND movieid IN
    (SELECT movieid FROM casting, actor
     WHERE actorid=actor.id
     AND name='Julie Andrews')
于 2013-12-10T09:09:46.237 回答
1

简单的解决方案:

select movie.title, actor.name FROM movie
JOIN casting
ON casting.movieid = movie.id
JOIN actor
ON actor.id = casting.actorid
where ord = 1 and 
movieid in (select movieid from casting join actor on id = actorid where name = 'Julie Andrews' )
于 2019-12-01T07:50:32.290 回答
0

我认为这是你得到它的正确方法。

SELECT m.title, a.name FROM
  movie m JOIN casting c ON c.id = m.movieid
        JOIN actor a ON a.id=m.actorid
    WHERE m.ord=1
    AND m.title = ALL
      (SELECT m1.title FROM 
         movie m1 JOIN casting c1 ON c1.id=m1.movieid
               JOIN actor a1 ON a1.id=m1.actorid
           WHERE a1.name='Julie Andrews');

如果您必须显示带有列名的表,那么我将修改此查询

于 2013-08-17T11:23:30.610 回答
0
select title, name from movie
join casting on (casting.movieid =movie.id)
join actor on (actor.id = casting.actorid)

where ord =1
and movieid in (select movie.id from movie
join casting on (casting.movieid =movie.id)
join actor on (actor.id = casting.actorid)

where name = 'Julie Andrews')
于 2018-10-28T17:20:10.970 回答
0
SELECT title,name
FROM movie
    JOIN casting ON (movieid=movie.id AND ord=1)
    JOIN actor   ON (actor.id=actorid)
WHERE movieid IN (SELECT movieid
                  FROM movie
                       JOIN casting ON (movieid=movie.id)
                       JOIN actor   ON (actor.id=actorid)
                  WHERE actor.name='Julie Andrews')

从子查询开始:选择所有包含“Julie Andrews”的电影的“movieid”,并将其用作 WHERE 中的过滤器

现在将所有 3 个表与一个特定条件连接起来,即您只选择 'ord'=1 的 'actorid'('ord'=1 意味着演员名称在演员的顺序之上)。这只会选择包含主角的演员 ID 的行/记录。最后,只需从“演员”表中检索这些主要演员的姓名。

于 2020-06-16T12:21:54.837 回答
-1
SELECT title,name FROM
casting join movie on movie.id=movieid and ord=1
        join actor on actor.id=actorid
WHERE  movie.id in (
SELECT movie.id FROM 
movie join casting on movie.id=movieid
      join actor on actor.id=actorid
                  WHERE name='Julie Andrews' )
于 2016-01-19T12:45:00.517 回答