SELECT DISTINCT actor_id
FROM
(SELECT DISTINCT actor_id
FROM cast
WHERE NOT movie_id in
(SELECT movie_id
FROM cast
INNER JOIN actors
ON actors.ID = cast.actor_id
WHERE full_name = 'Kevin Bacon')) as A
WHERE movie_id in
(SELECT movie_id
FROM cast
WHERE actor_id in
(SELECT DISTINCT actor_id
FROM cast
WHERE movie_id in
(SELECT movie_id
FROM cast
INNER JOIN actors
ON actors.ID = cast.actor_id
WHERE full_name = 'Kevin Bacon')))
AND actor_id <> (SELECT id from actors
where full_name = "Kevin Bacon")
;
在“ IN / ALL / ANY子查询”中,我不断收到未知列“ movie_id”的错误;我不明白,因为单独执行此代码的各个块工作正常。
我在这里想念什么?
谢谢!
答案 0 :(得分:0)
在这个简化的查询示例中,我看到并出错了:
SELECT DISTINCT actor_id
FROM ( SELECT DISTINCT actor_id FROM ...) as A
WHERE movie_id in (...);
在WHERE子句中,您引用的是“ A”表中的“ movie_id”,但在内部查询“(SELECT DISTINCT actor_id FROM ...)”中未选中此列。
此外,还有很多查询,我敢肯定,如果您举一个“用词”示例说明要获取的内容,则可以简化此过程。
响应已评论的目标
对于您的目标,我没有找到简单的答案,但是我会这样:
首先,我将基于他们扮演的电影来创建具有演员关系的视图...
CREATE VIEW vw_relations AS (
SELECT
c1.actor_id AS actor1_id, a1.full_name AS actor1_fullname,
c1.movie_id, m.title AS movie_title,
c2.actor_id AS actor2_id, a2.full_name AS actor2_fullname
FROM
cast AS c1
INNER JOIN
cast AS c2 ON c2.movie_id = c1.movie_id AND c2.actor_id != c1.actor_id
INNER JOIN
movies AS m ON m.id = c1.movie_id
INNER JOIN
actors AS a1 ON a1.id = c1.actor_id
INNER JOIN
actors AS a2 ON a2.id = c2.actor_id
);
现在,如果演员NAME1和演员NAME2参加了同一部电影,那么在上一个视图中将出现带有下一个值的行:
(id_name1, name1, movie_id, movie_title, id_name2, name2)
(id_name2, name2, movie_id, movie_title, id_name1, name1)
换句话说,该关系将出现两次,但这简化了下一个查询...
现在,根据您的定义,可以像这样获得演员“凯文·培根”(与他合作的演员)的<1°接近度:
CREATE VIEW vw_1_degree_to_kb AS (
SELECT
actor1_id, actor1_fullname
FROM
vw_relations
WHERE
actor2_fullname = "Kevin Bacon"
);
现在,对于演员“凯文·培根”(与他一起工作的演员一起)的2º紧密度,我将这样做(并且也保存在视图中):>
CREATE VIEW vw_2_degree_to_kb AS (
SELECT
actor1_id, actor1_fullname
FROM
vw_relations
WHERE
actor2_id IN (SELECT actor1_id FROM vw_1_degree_to_kb)
AND
actor1_id NOT IN (SELECT actor1_id FROM vw_1_degree_to_kb)
AND
actor1_fullname != "Kevin Bacon"
);
换句话说,此视图包含与“凯文·培根”(Kevin Bacon)的接近度为1°的演员一起工作的演员,但还不属于该集合。
3º的紧密度将是这样的:
CREATE VIEW vw_3_degree_to_kb AS (
SELECT
actor1_id, actor1_fullname
FROM
vw_relations
WHERE
actor2_id IN (SELECT actor1_id FROM vw_2_degree_to_kb)
AND
actor1_id NOT IN (SELECT actor1_id FROM vw_1_degree_to_kb)
AND
actor1_id NOT IN (SELECT actor1_id FROM vw_2_degree_to_kb)
AND
actor1_fullname != "Kevin Bacon"
);