首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLzoo more加入execerise #16

SQLzoo more加入execerise #16
EN

Stack Overflow用户
提问于 2013-03-18 06:08:35
回答 12查看 4.6K关注 0票数 2

我正在与电影数据库进行更多的连接操作。我的问题是关于问题#16:列出所有与'Art Garfunkel‘合作过的人。

您需要首先获取Art Garfunkel在其中的所有电影作为一个值,然后通过将其与第一个值进行比较来获取在同一电影中的所有人的姓名。

我想出了我自己的查询,根据逻辑,它应该可以工作,但并不是由于超时(我假设这是由于低效的查询)

我的问题是:

代码语言:javascript
复制
SELECT DISTINCT a.name
FROM actor a
JOIN casting b ON (a.id=b.actorid) 
JOIN movie c ON (b.movieid=c.id)
WHERE c.title IN(SELECT z.title
FROM movie z
JOIN casting y ON (z.id=y.movieid)
JOIN actor x on (y.actorid=x.id)
WHERE x.name='Art Garfunkel')

另一个版本:

代码语言:javascript
复制
SELECT DISTINCT actor.name
FROM movie,actor,casting
WHERE movie.id=casting.movieid
AND actor.id=casting.actorid
AND movie.title IN(SELECT movie.title
FROM movie,actor,casting
WHERE movie.id=casting.movieid
AND actor.id=casting.actorid
AND actor.name='Art Garfunkel')

这两种方法都会抛出一个解析错误,说明在尝试查询上面显示的内容时出现超时。

代码语言:javascript
复制
SELECT DISTINCT d.name
FROM actor d JOIN casting a ON (a.actorid=d.id)
   JOIN casting b ON (a.movieid=b.movieid)
   JOIN actor c ON (b.actorid=c.id 
                AND c.name='Art Garfunkel')
  WHERE d.id!=c.id

我的逻辑在这里是完全错误的吗?

这么多问题,但我想要反馈为什么查询不起作用,以及下一步是什么。

EN

回答 12

Stack Overflow用户

发布于 2013-03-18 06:33:08

下面是所有sql zoo问题的答案:answers

代码语言:javascript
复制
SELECT a.name
 FROM casting c JOIN actor a ON
  a.id = c.actorid
 WHERE 
  a.name <> 'Art Garfunkel' AND
  c.movieid 
 IN (
  SELECT m.id
     FROM casting c JOIN movie m ON
       m.id = c.movieid
     JOIN actor a ON
       c.actorid = a.id
     WHERE a.name = 'ART Garfunkel'
)
ORDER BY a.name
票数 1
EN

Stack Overflow用户

发布于 2018-12-18 09:59:06

下面是我的问题和如何派生它的清晰解释。

步骤1:获取Art Garfunkel的所有movieids

代码语言:javascript
复制
select movie.id 
from actor 
     join 
     casting on actor.id=casting.actorid 
     join 
     movie on movie.id=casting.movieid
where actor.name='Art Garfunkel'
group by movie.id

步骤2:现在从这些movieids列表中获取这些电影中的所有演员。

代码语言:javascript
复制
  select actor.name 
  from casting 
       join 
       actor on casting.actorid=actor.id 
       join 
       movie on movie.id=casting.movieid
 where casting.movieid in
                       ( select movie.id 
                         from actor 
                              join 
                              casting on actor.id=casting.actorid 
                              join 
                              movie on movie.id=casting.movieid
                         where actor.name='Art Garfunkel'
                         group by movie.id
                      )

第3步:我们需要共同参与者来消除结果集中的'Art Garfunkel'

代码语言:javascript
复制
     select actor.name 
     from casting 
           join 
           actor on casting.actorid=actor.id 
           join 
           movie on movie.id=casting.movieid
     where casting.movieid in
                           ( select movie.id 
                             from actor 
                                  join 
                                  casting on actor.id=casting.actorid 
                                  join 
                                  movie on movie.id=casting.movieid
                             where actor.name='Art Garfunkel'
                             group by movie.id
                          )
   and actor.name!='Art Garfunkel'
票数 1
EN

Stack Overflow用户

发布于 2014-10-26 02:07:08

好吧,我花了几个小时才真正弄明白这个(16号),因为建议的解决方案第一眼看起来没有意义(第二次也没有)。然而,在我提出了自己的解决方案后,我设法弄清楚了,这是更容易理解的(我觉得)。所以首先我的解决方案是:

代码语言:javascript
复制
select name from actor 
join casting on actor.id=actorid
where movieid in
(select movieid from casting
join actor on actorid=actor.id
where name='Art Garfunkel')
and name <>'Art Garfunkel'

我搜索所有的演员(=外部选择),为那些阿特·加芬克尔在其中扮演角色的电影(内部选择),然后我过滤掉阿特·加芬克尔本人。

很简单。

代码语言:javascript
复制
order by name

当我不理解别人的解决方案时,这让我很烦恼,我花了一些时间在其他地方给出的解决方案上。这又是一个例子:

代码语言:javascript
复制
SELECT DISTINCT a.name
FROM actor a 
JOIN casting b ON (a.id=b.actorid)
JOIN casting c on b.movieid=c.movieid
JOIN actor d ON (c.actorid=d.id 
                AND d.name='Art Garfunkel')
WHERE a.id!=d.id

有趣的是,您可以编写稍微不同的代码,并从最后一个连接中删除where子句:

代码语言:javascript
复制
SELECT DISTINCT a.name
FROM actor a 
JOIN casting b ON (a.id=b.actorid)
JOIN casting c on b.movieid=c.movieid
JOIN actor d ON (c.actorid=d.id)
WHERE d.name='Art Garfunkel' 
AND a.id!=d.id

在任何情况下,您都必须向后查看这个查询,否则它永远不会有意义。这似乎就是发生的事情:

-d(或Where子句的第一部分,似乎首先计算)设置(或限制) Art Garfunkel,并将其传递回casting ccasting c查找来自Art Garfunkel的电影(顺便说一句,这是两部电影:22号军规是1412,拳击海伦娜是1597 ),并将它们设置为casting-b—as casting的过滤器-b接管它们。在-a中,所有在这两部电影中出演过的演员的名字都会被查找到。最后,Art Garfunkel被过滤掉了--仅此而已。

在我看来,这似乎是一些机器代码,好像是某个查询运算器想出了它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15466826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档