如何列出所有与Art Garfunkel'?合作过的人

时间:2016-04-29 05:16:03

标签: sql

我有3个表# controller (writing quickly, code may not be totally right, hopefully you get gist data = Hash.new data["items"] = [] @order.items.each do |item| item_hash = { "name" => item.name, "amount" => Amount.where(item_id: item.id).first.amount, "refund" => Refund.where(item_id:item.id).first.amount } data["items"] << item_hash end # view code <% data["items"].each do |item| %> <td><%= item["name"] %></td> <td><%= item["refund"] %></td> <td><%= item["amount"] %></td> <% end %> dataactor。我必须找到与演员&#34; ART Garfunkel&#34;合作过的人。

我有解决方案,但我无法理解以下查询的工作原理。

movie

还有一个解决方案:

casting

11 个答案:

答案 0 :(得分:1)

这是MySQL的解决方案:

*

答案 1 :(得分:1)

简便解决方案:

SELECT distinct actor.name
FROM movie
JOIN casting
ON casting.movieid = movie.id
JOIN actor
ON actor.id = casting.actorid
where movie.id in (select movieid from casting join actor on id =actorid where 
actor.name = 'Art Garfunkel') and actor.name <> 'Art Garfunkel'

答案 2 :(得分:0)

很难理解你的问题......这是我建议的解决方案:

SELECT
    *
FROM
    Actor A
INNER JOIN
    Casting C
ON
    C.ActorID = A.ID
WHERE C.MovieID IN (
    SELECT
        C.MovieID
    FROM
        Casting C
    INNER JOIN
        Actor A
    ON
        C.ActorID = A.ID
    WHERE
        Actor = 'Art Garfunkel'
)
WHERE
        Actor <> 'Art Garfunkel'

子查询首先查找演员所在的所有电影。第二个外部查询查找在所述子查询中返回的电影中扮演过的所有演员。

答案 3 :(得分:0)

这是一个做同样事情的简化版本:

select actor.name
from (
    select movieid from casting
    join actor on actor.id = casting.actorid 
        and actor.name = 'Art Garfunkel'
) ag_movies
join casting on ag_movies.movieid = casting.movidid
join actor on actor.id = casting.actorid 
    and actor.name != 'Art Garfunkel'

您的步骤大致相同:

  1. 获取Art Garfunkel所有电影的movieid。
  2. 查找所有这些电影的演员表。
  3. 从不是Art Garfunkel的演员表中获取艺术家姓名。
  4. 投射表是一个交叉查找表,允许许多演员在许多电影中表演。通过演员表我们必须找到Art所有的电影,然后反过来查找这些电影中的其他演员。

    连接意味着结果只包含两个表中与连接条件匹配的行。因此on actor.id = casting.actorid and actor.name = 'Art Garfunkel'通过匹配的ID连接表,但将结果限制为只有演员姓名为Art的ID。这些查询中使用的连接与集合理论中的交集相同。

    括号内的子选择会创建一个临时表(在此示例中名为ag_movies),父查询可以像使用任何其他表一样使用该表。

答案 4 :(得分:0)

SELECT name FROM actor
JOIN casting ON actor.id = actorid WHERE casting.movieid IN 
(SELECT movieid FROM casting WHERE name != 'Art Garfunkel' AND
actorid in (SELECT actor.id FROM actor WHERE name =  'Art Garfunkel')) 

答案 5 :(得分:0)

SELECT name FROM actor 
JOIN casting ON id=casting.actorid 
WHERE movieid IN(
    SELECT movieid FROM casting 
    WHERE actorid IN(
        SELECT id FROM actor 
        WHERE name = 'Art Garfunkel')) 
AND name <> 'Art Garfunkel'

答案 6 :(得分:0)

SELECT DISTINCT a.NAME
FROM   casting c
       JOIN actor a
         ON c.actorid = a.id
WHERE  c.movieid IN (SELECT c.movieid
                     FROM   casting c
                            JOIN actor a
                              ON c.actorid = a.id
                     WHERE  a.NAME = 'Art Garfunkel')
       AND a.NAME <> 'Art Garfunkel'
ORDER  BY 1  

答案 7 :(得分:0)

下面的代码将解决此问题:

select distinct name 
  from actor  
  join casting on id=actorid
 where actorid IN
              (select actorid
                 from casting 
                where movieid IN
                      (select movieid 
                         from casting 
                        where actorid = 
                                     (select id from actor where 
                                       name= 'Art Garfunkel')
                       )
               )
and
name <> 'Art Garfunkel'

答案 8 :(得分:0)

SELECT name

FROM actor
    JOIN casting ON (actorid=id)

WHERE movieid IN (SELECT movieid

                  FROM casting
                     JOIN actor ON (actorid=id)

                  WHERE name='Art Garfunkel')
     AND name<>'Art Garfunkel'

有问题的查询非常复杂。一个简单的查询将帮助您更好地理解逻辑流程。从子查询开始,我们选择由“ Art Garfunkel”主演的“电影”列表。主查询从子查询返回的电影列表中选择所有演员。在最后一步中,我们必须删除“ Art Garfunkel”本人的条目,否则他的名字也将出现在列表中。 “ Art Garfunkel”本人无法与“ Art Garfunkel”本人合作。

答案 9 :(得分:0)

 SELECT name FROM actor 
    JOIN casting on actor.id= actorid
    
     WHERE casting.movieid IN
          (SELECT movie.id FROM movie
          JOIN casting ON movie.id = movieid
          JOIN actor ON actor.id = actorid
          WHERE actor.name = 'Art Garfunkel') AND name <> 'Art Garfunkel'

我发现在分解之前,更容易理解以根级别转换代码。所以它是这样的: 获取演员Garfunkel所在的演员的名字,而不是Art Garfunkel的演员的名字

答案 10 :(得分:0)

SELECT name
FROM actor 
WHERE id IN(SELECT c.actorid 
            FROM casting c
            JOIN actor a ON c.actorid = a.id
            WHERE c.movieid IN(
                  SELECT c.movieid
                  FROM casting c
                  JOIN actor a
                  ON a.id = c.actorid
                  WHERE a.name = 'Art Garfunkel')) AND NOT name = 'Art Garfunkel'