2

我有三个表:演员列表(actors.sql),电影列表(movies.sql),以及每部电影中扮演的演员列表(以及他们的角色,roles.sql)。以下是每个表的片段:sqlsnippet

这些表要长得多,有数千个条目未在此图像中显示。我之前的一个练习题是显示一个演员出演的每部电影的表格(从 HTML 表单和 PHP 在另一个页面上检索演员姓名)。代码如下:

    SELECT actor_id, movie_id, name, year
    FROM roles r
    JOIN actors a ON a.id = r.actor_id
    JOIN movies m ON m.id = r.movie_id
    WHERE first_name = '$actor_first' AND last_name = '$actor_last'
    ORDER BY year DESC;

现在我想交叉参考这些表格,找出谁与特定演员合作过,以及他们合作过哪些电影。假设我想看看“凯文史派西”与“威尔史密斯”一起出现在哪些电影中,我想要一张列出它们的表格。问题是,我不确定如何。

有小费吗?

4

2 回答 2

2

如果你有两个演员,你可以用这个查询

select m.*
  from movies m
 where exists (select 1
                 from roles r1
                      inner join actors a1
                         on a1.actor_id = r1.actor_id
                where r1.movie_id = m.movie_id
                  and a1.first_name = 'Kevin'
                  and a1.last_name = 'Spacey')
   and exists (select 1
                 from roles r2
                      inner join actors a2
                         on a2.actor_id = r2.actor_id
                where r2.movie_id = m.movie_id
                  and a2.first_name = 'Will'
                  and a2.last_name = 'Smith')

它将返回两个演员都扮演角色的所有电影的所有电影数据。

于 2012-11-29T02:08:00.797 回答
1

除了接受的答案之外,您也可以这样做,计算movie_ID结果中的记录数,这等于您在条件中提供的演员数。

SELECT  m.*
FROM    movies m
        INNER JOIN
        (
            SELECT  a.movie_ID
            FROM    roles a
                    INNER JOIN actors b
                        ON a.actor_ID = b.id
            WHERE   (b.first_name = 'Kevin' AND  b.last_name = 'Spacey') OR
                    (b.first_name = 'Will' AND  b.last_name = 'Smith')
            GROUP BY a.movie_ID
            HAVING COUNT(*) = 2
        ) n ON m.movie_ID = n.movie_ID

查询发生了什么?

WHERE   (b.first_name = 'Kevin' AND  b.last_name = 'Spacey') OR
        (b.first_name = 'Will' AND  b.last_name = 'Smith')

在这里,您可以通过添加OR条件运算符找到尽可能多的演员

HAVING COUNT(*) = 2

的值COUNT应该等于您要搜索的演员数量。

的如果你需要找到3个演员一起合作过同一部电影,那么你应该只修改WHERE条款和条款的价值HAVING

WHERE   (b.first_name = 'Kevin' AND  b.last_name = 'Spacey') OR
        (b.first_name = 'Will' AND  b.last_name = 'Smith') OR
        (b.first_name = 'Ben' AND  b.last_name = 'Affleck')
GROUP BY a.movie_ID
HAVING COUNT(*) = 3
于 2012-11-29T02:41:54.230 回答