我正在开发一个关系数据库,其中包含视频游戏及其用户的信息。我想创建一个视图来显示玩特定游戏(例如 FIFA 22)的用户的名字、姓氏和电子邮件。
我的数据库中有三张表:
“NAME”表包含每个游戏的ID(
id_game
),名称(name
)和描述(description
)。
“PLAY”表包含每个游戏的id(
id_game
)和每个用户的id(id_system_user
)。
“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
);
为什么这两个变体运行良好但第一个代码却没有?
你只需要将 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"
;