INNER JOIN 中的子查询(MySQL Workbench)

问题描述 投票:0回答:1

我正在开发一个关系数据库,其中包含视频游戏及其用户的信息。我想创建一个视图来显示玩特定游戏(例如 FIFA 22)的用户的名字、姓氏和电子邮件。

我的数据库中有三张表:

  1. “NAME”表包含每个游戏的ID(

    id_game
    ),名称(
    name
    )和描述(
    description
    )。

  2. “PLAY”表包含每个游戏的id(

    id_game
    )和每个用户的id(
    id_system_user
    )。

  3. “SYSTEM_USER”表包含每个用户的 ID(

    id_system_user
    )、名字(
    first_name
    )、姓氏(
    last_name
    )和电子邮件(
    email

我已经尝试创建视图,然后在 INNER JOIN 中使用子查询来连接这三个表,但每次执行它时都会出错。代码如下:

CREATE OR REPLACE VIEW vw_FIFA22 AS
    (SELECT S.first_name AS "First name",
            S.last_name AS "Last name",
            S.email AS "E-Mail"
     FROM SYSTEM_USER AS S
     INNER JOIN (SELECT G.name AS "Game name",
                        P.id_system_user AS "System user"
                 FROM GAME AS G
                 INNER JOIN PLAY AS P ON (G.id_game = P.id_game)
                 WHERE G.name = "FIFA 22") AS N
     ON (S.id_system_user = N.id_system_user)
    );

错误是:

Error Code: 1054. Unknown column 'N.id_system_user' in 'on clause'

然后我尝试运行下一段代码并得出:

CREATE OR REPLACE VIEW vw_FIFA22 AS
    (SELECT S.first_name,
            S.last_name,
            S.email
     FROM SYSTEM_USER AS S
     INNER JOIN PLAY AS P
     ON (S.id_system_user = P.id_system_user)
     WHERE id_game = (SELECT id_game
                      FROM GAME
                      WHERE name = "FIFA 22")
    );

此外,在阅读了这个问题的答案后(MySQL INNER JOIN with SubQuery(非常详细)),我尝试运行其他变体并且它也有效:

CREATE OR REPLACE VIEW vw_FIFA22 AS
    (SELECT S.first_name AS "First name",
            S.last_name AS "Last name",
            S.email AS "E-Mail"
     FROM (SELECT P.id_system_user
           FROM GAME AS G
           INNER JOIN PLAY AS P ON (G.id_game = P.id_game)
           WHERE G.name = "FIFA 22") AS P
     INNER JOIN SYSTEM_USER AS S
     ON S.id_system_user = P.id_system_user
    );

为什么这两个变体运行良好但第一个代码却没有?

mysql sql subquery inner-join
1个回答
0
投票

你只需要将 3 个表连接在一起,不需要子查询例如

CREATE OR REPLACE VIEW vw_FIFA22 AS
(SELECT S.first_name AS "First name",
        S.last_name AS "Last name",
        S.email AS "E-Mail"
 FROM SYSTEM_USER AS S
 INNER JOIN PLAY AS P ON S.id_system_user = P.id_system_user
 INNER JOIN GAME G ON G.id_game = P.id_game
 WHERE G.name = "FIFA 22"
 ;
© www.soinside.com 2019 - 2024. All rights reserved.