我正在与电影数据库进行更多的连接操作。我的问题是关于问题#16:列出所有与'Art Garfunkel‘合作过的人。
您需要首先获取Art Garfunkel在其中的所有电影作为一个值,然后通过将其与第一个值进行比较来获取在同一电影中的所有人的姓名。
我想出了我自己的查询,根据逻辑,它应该可以工作,但并不是由于超时(我假设这是由于低效的查询)
我的问题是:
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')另一个版本:
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')这两种方法都会抛出一个解析错误,说明在尝试查询上面显示的内容时出现超时。
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我的逻辑在这里是完全错误的吗?
这么多问题,但我想要反馈为什么查询不起作用,以及下一步是什么。
发布于 2013-03-18 06:33:08
下面是所有sql zoo问题的答案:answers
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发布于 2018-12-18 09:59:06
下面是我的问题和如何派生它的清晰解释。
步骤1:获取Art Garfunkel的所有movieids
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列表中获取这些电影中的所有演员。
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'
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'发布于 2014-10-26 02:07:08
好吧,我花了几个小时才真正弄明白这个(16号),因为建议的解决方案第一眼看起来没有意义(第二次也没有)。然而,在我提出了自己的解决方案后,我设法弄清楚了,这是更容易理解的(我觉得)。所以首先我的解决方案是:
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'我搜索所有的演员(=外部选择),为那些阿特·加芬克尔在其中扮演角色的电影(内部选择),然后我过滤掉阿特·加芬克尔本人。
很简单。
order by name当我不理解别人的解决方案时,这让我很烦恼,我花了一些时间在其他地方给出的解决方案上。这又是一个例子:
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子句:
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 c。casting c查找来自Art Garfunkel的电影(顺便说一句,这是两部电影:22号军规是1412,拳击海伦娜是1597 ),并将它们设置为casting-b—as casting的过滤器-b接管它们。在-a中,所有在这两部电影中出演过的演员的名字都会被查找到。最后,Art Garfunkel被过滤掉了--仅此而已。
在我看来,这似乎是一些机器代码,好像是某个查询运算器想出了它。
https://stackoverflow.com/questions/15466826
复制相似问题