在 SQL 中使用复杂子查询进行练习
Exercise in SQL with complex subquery
我正在尝试在 SQL 中进行查询。该数据库是IMBD的一个。这是表格:
所以,我需要电影《低俗小说》(id=2175869) 中的 actors/actress,它从未与另一位低俗小说的演员/女演员在其他电影中合作过。
应该是这样的:
SELECT person_id FROM cast_info WHERE movie_id = 2175869 AND
person_id NOT IN (SELECT )
但是我不知道如何做第二部分。
稍后用作子查询的查询,返回除 Pulp Fiction 以外的电影,其中有不止一位 Pulp Fiction 演员在其中演出
SELECT movie_id
FROM cast_info
WHERE
movie_id <> 2175869 AND
person_id IN (SELECT person_id FROM cast_info WHERE movie_id = 2175869)
GROUP BY movie_id
HAVING COUNT(*) > 1
现在让从未在此类电影中出演过《低俗小说》的人加入
SELECT person_id
FROM cast_info
WHERE
movie_id = 2175869 AND
person_id NOT IN (
SELECT person_id FROM cast_info WHERE movie_id IN (
SELECT movie_id
FROM cast_info
WHERE
movie_id <> 2175869 AND
person_id IN (SELECT person_id FROM cast_info WHERE movie_id = 2175869)
GROUP BY movie_id
HAVING COUNT(*) > 1
)
)
注意:我假设每部电影只能选派一位演员一次。如果同一演员可以在同一部电影中担任不同角色,则将 COUNT(*)
替换为 COUNT(DISTINCT person_id)
。
首先你需要看到低俗小说中的所有演员:
SELECT person_id as pulp_actor_id
FROM cast_info
WHERE movie_id = 2175869
然后你需要找到所有的演员组合:
SELECT c1.person_id as actor1_id
c2.person_id as actor2_id
FROM cast_info c1
JOIN cast_info c2
ON c1.person_id < c2.person_id
WHERE c1.movie_id = 2175869
AND c2.movie_id = 2175869;
找到除低俗小说之外所有二人组合作的电影。
SELECT actor1_id, actor2_id, actor1_movies.movie_id
FROM (SELECT c1.person_id as actor1_id
c2.person_id as actor2_id
FROM cast_info c1
JOIN cast_info c2
ON c1.person_id < c2.person_id
WHERE c1.movie_id = 2175869
AND c2.movie_id = 2175869) as duos
JOIN cast_info as actor1_movies
ON duos.actor1_id = actor1_movies.person_id
AND actor1.movie_id <> 2175869
LEFT JOIN cast_info actor2_movies
ON duos.actor2_id = actor2_movies.person_id
AND actor1_movies.movie_id = actor2_movies.movie_id
WHERE actor2.movie_id IS NOT NULL;
现在获取不在最后结果中的低俗小说中的所有演员
SELECT person_id as pulp_actor_id
FROM cast_info c
LEFT JOIN ( SELECT actor1_id, actor2_id, actor1_movies.movie_id
FROM (SELECT c1.person_id as actor1_id
c2.person_id as actor2_id
FROM cast_info c1
JOIN cast_info c2
ON c1.person_id < c2.person_id
WHERE c1.movie_id = 2175869
AND c2.movie_id = 2175869) as duos
JOIN cast_info as actor1_movies
ON duos.actor1_id = actor1_movies.person_id
AND actor1.movie_id <> 2175869
LEFT JOIN cast_info actor2_movies
ON duos.actor2_id = actor2_movies.person_id
AND actor1_movies.movie_id = actor2_movies.movie_id
WHERE actor2.movie_id IS NOT NULL;
WHERE movie_id = 2175869 ) as duos
ON c.person_id IN ( actor1_id, actor2_id )
WHERE duos.movie_id IS NULL
我正在尝试在 SQL 中进行查询。该数据库是IMBD的一个。这是表格:
所以,我需要电影《低俗小说》(id=2175869) 中的 actors/actress,它从未与另一位低俗小说的演员/女演员在其他电影中合作过。
应该是这样的:
SELECT person_id FROM cast_info WHERE movie_id = 2175869 AND
person_id NOT IN (SELECT )
但是我不知道如何做第二部分。
稍后用作子查询的查询,返回除 Pulp Fiction 以外的电影,其中有不止一位 Pulp Fiction 演员在其中演出
SELECT movie_id
FROM cast_info
WHERE
movie_id <> 2175869 AND
person_id IN (SELECT person_id FROM cast_info WHERE movie_id = 2175869)
GROUP BY movie_id
HAVING COUNT(*) > 1
现在让从未在此类电影中出演过《低俗小说》的人加入
SELECT person_id
FROM cast_info
WHERE
movie_id = 2175869 AND
person_id NOT IN (
SELECT person_id FROM cast_info WHERE movie_id IN (
SELECT movie_id
FROM cast_info
WHERE
movie_id <> 2175869 AND
person_id IN (SELECT person_id FROM cast_info WHERE movie_id = 2175869)
GROUP BY movie_id
HAVING COUNT(*) > 1
)
)
注意:我假设每部电影只能选派一位演员一次。如果同一演员可以在同一部电影中担任不同角色,则将 COUNT(*)
替换为 COUNT(DISTINCT person_id)
。
首先你需要看到低俗小说中的所有演员:
SELECT person_id as pulp_actor_id
FROM cast_info
WHERE movie_id = 2175869
然后你需要找到所有的演员组合:
SELECT c1.person_id as actor1_id
c2.person_id as actor2_id
FROM cast_info c1
JOIN cast_info c2
ON c1.person_id < c2.person_id
WHERE c1.movie_id = 2175869
AND c2.movie_id = 2175869;
找到除低俗小说之外所有二人组合作的电影。
SELECT actor1_id, actor2_id, actor1_movies.movie_id
FROM (SELECT c1.person_id as actor1_id
c2.person_id as actor2_id
FROM cast_info c1
JOIN cast_info c2
ON c1.person_id < c2.person_id
WHERE c1.movie_id = 2175869
AND c2.movie_id = 2175869) as duos
JOIN cast_info as actor1_movies
ON duos.actor1_id = actor1_movies.person_id
AND actor1.movie_id <> 2175869
LEFT JOIN cast_info actor2_movies
ON duos.actor2_id = actor2_movies.person_id
AND actor1_movies.movie_id = actor2_movies.movie_id
WHERE actor2.movie_id IS NOT NULL;
现在获取不在最后结果中的低俗小说中的所有演员
SELECT person_id as pulp_actor_id
FROM cast_info c
LEFT JOIN ( SELECT actor1_id, actor2_id, actor1_movies.movie_id
FROM (SELECT c1.person_id as actor1_id
c2.person_id as actor2_id
FROM cast_info c1
JOIN cast_info c2
ON c1.person_id < c2.person_id
WHERE c1.movie_id = 2175869
AND c2.movie_id = 2175869) as duos
JOIN cast_info as actor1_movies
ON duos.actor1_id = actor1_movies.person_id
AND actor1.movie_id <> 2175869
LEFT JOIN cast_info actor2_movies
ON duos.actor2_id = actor2_movies.person_id
AND actor1_movies.movie_id = actor2_movies.movie_id
WHERE actor2.movie_id IS NOT NULL;
WHERE movie_id = 2175869 ) as duos
ON c.person_id IN ( actor1_id, actor2_id )
WHERE duos.movie_id IS NULL