1

嗯,好吧,我不擅长解释事情,所以我先给你引用和链接:

问题 4b(接近底部):

4b。列出所有“朱莉·安德鲁斯”电影的片名和男主角。

电影(id, title, yr, score, votes, director)
actor(id, name)
cast(movieid, actorid, ord)
(注:movie.id = cast.movi​​eid, actor.id = cast.actorid)

我的回答(不起作用):
    SELECT title, name
      FROM casting JOIN movie
              ON casting.movieid = movie.id
      JOIN actor
              ON casting.actorid = actor.id
     WHERE name = 'Julie Andrews'
       AND ord = 1

这里的问题是它想要以“朱莉安德鲁斯”作为演员的电影的主要演员名单(不一定是主要演员),但我所做的只是让她担任主角的电影(ord = 1)。

如果没有“朱莉安德鲁斯”,我如何指定主要演员名单?我怀疑我必须对 GROUP BY 做点什么,但我现在不知道是什么......

编辑:我需要使用嵌套的 SELECT 吗?

4

9 回答 9

6

使用子查询有很多很好的方法,但在本教程的这一点上,您似乎只使用 JOIN。以下是仅使用 JOIN 的方法:

SELECT
  movie.title,
  a2.name
FROM
  actor AS a1
  JOIN casting AS c1 ON (a1.id = c1.actorid)
  JOIN movie ON (c1.movieid = movie.id)
  JOIN casting AS c2 ON (movie.id = c2.movieid)
  JOIN actor AS a2 ON (c2.actorid = a2.id)
WHERE 
  a1.name = 'Julie Andrews'
  AND c2.ord = 1

编辑(更具描述性):

这将为我们提供一个包含 Julie Andrews 出演的所有电影的表格。我将演员表和演员表分别别名为 a1 和 c1,因为现在我们已经找到了电影列表,我们将不得不转向并匹配再次对着铸造台。

SELECT
  movie.*
FROM
  actor a1
  JOIN casting c1 ON (a1.id = c1.actorid)
  JOIN movie ON (c1.movieid = movie.id)
WHERE
  a1.name = 'Julie Andrews'

现在我们有了她演过的所有电影的列表,我们需要将其与演员表(如 c2)和演员表(如 a2)相结合,以获得这些电影的主角列表:

SELECT
  movie.title,  -- we'll keep the movie title from our last query
  a2.name       -- and select the actor's name (from a2, which is defined below)
FROM
  actor a1                                     -- \
  JOIN casting AS c1 ON (a1.id = c1.actorid)   --  )- no changes here
  JOIN movie ON (c1.movieid = movie.id)        -- /
  JOIN casting AS c2 ON (movie.id = c2.movieid)  -- join list of JA movies to the cast
  JOIN actor AS a2 ON (c2.actorid = a2.id)  -- join cast of JA movies to the actors
WHERE 
  a1.name = 'Julie Andrews'  -- no changes
  AND c2.ord = 1    -- only select the star of the JA film

编辑:在别名中,“AS”关键字是可选的。我在上面插入了它以帮助查询更有意义

于 2009-01-11T23:48:33.870 回答
4

您希望将电影与casting表中两个可能单独的行进行匹配:第一行是 Julie Andrews 是演员,第二行可能是也可能不是 Julie Andrews,但它是电影的男主角。

朱莉<--->参演<--->电影<--->主演<--->男主角

所以你需要加入casting表两次。

SELECT m.title, lead.name
FROM actor AS julie
 JOIN casting AS c1 ON (julie.id = c1.actorid)
 JOIN movie AS m ON (c1.movieid = m.id)
 JOIN casting AS c2 ON (m.id = c2.movieid)
 JOIN actor AS lead ON (c2.actorid = lead.id)
WHERE julie.name = 'Julie Andrews'
 AND c2.ord = 1;

请记住,“表别名”引用可能不同的行,即使它们是同一个表的别名。

于 2009-01-11T23:50:59.793 回答
3
SELECT title, name
      FROM casting JOIN movie
              ON casting.movieid = movie.id
      JOIN actor
              ON casting.actorid = actor.id
     WHERE ord = 1
     and   casting.movieid in 
          (select movieid
           from   casting
                  join actor
                      on actor.id = casting.actorid
           where  actor.name = 'Julie Andrews')
于 2009-01-11T23:43:44.317 回答
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')

去搞清楚。:P

于 2009-01-12T04:20:10.497 回答
0
select title, name  from movie join casting on movie.id=movieid
join actor on actor.id=actorid 
where ord=1 and movieid in (select movieid from actor join casting 
                                            on actor.id=actorid 
         where name='julie andrews' and (ord=1 or ord<>1))group by title, name
于 2015-05-22T06:44:22.830 回答
0

@Bill Karwin 的回答有利于方向。然而,结果证明有些电影的名字已经出现了不止一次。所以我们需要在 SELECT 行的 title 之前添加一个 DISTINCT 函数。

SELECT DISTINCT m.title, lead.name

如果你想要更快速的响应,你也可以用这种方式编写代码。

SELECT DISTINCT m.title, lead.name
 FROM actor AS julie
  JOIN casting AS c1 ON (julie.id = c1.actorid AND julie.name = 'Julie Andrews')
  JOIN movie AS m ON (c1.movieid = m.id)
  JOIN casting AS c2 ON (m.id = c2.movieid)
  JOIN actor AS lead ON (c2.actorid = lead.id)
 WHERE  c2.ord = 1;
于 2015-08-07T14:23:15.370 回答
0
I ve done simply like this

select distinct title,name from 
(select movie.* from movie
inner join casting on (movie.id = casting.movieid)
inner join actor on (casting.actorid = actor.id)
where actor.name = 'Julie Andrews' ) as moviesFromJulie

inner join casting on (moviesFromJulie.id = casting.movieid)
inner join actor on (casting.actorid = actor.id)
where ord = 1

检索朱莉·安德鲁斯出演的所有电影,然后为这些电影检索序数 = 1 的所有电影和演员,并为独特的结果而区分

于 2016-09-08T13:20:26.933 回答
0

分享一个简单的答案-

select title, name from movie join casting on movie.id=movieid join actor on actor.id=actorid where ord=1 and movie.id in (select movie.id from movie join casting on movie.id=movieid join actor on actor.id=actorid where name='Julie Andrews')

于 2018-01-31T08:31:45.160 回答
0
SELECT title , name
FROM movie JOIN casting ON (casting.movieid=movie.id) JOIN actor ON (actor.id=actorid)
WHERE (movieid IN (SELECT movieid
FROM casting JOIN actor ON (actor.id=actorid)
WHERE name =  'Julie Andrews')) AND (ord=1)
于 2019-01-13T16:22:59.030 回答