错误代码:1054。“ IN / ALL / ANY子查询”中的未知列“ movie_id”

时间:2018-09-26 22:48:37

标签: mysql

   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”的错误;我不明白,因为单独执行此代码的各个块工作正常。

我在这里想念什么?

谢谢!

1 个答案:

答案 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"
);