我正在尝试将两个单独的SQL语句的输出合并到一个表中。我有一个团队名称列表,在一个数据库中有关联的id,另一个数据库在另一个数据库中有匹配列表。 e.g
Teams
-----------------
id name
1 Arsenal
2 Aston Villa
Matches
--------------------------------
id home_team_id away_team_id
1 1 2
在match数据库中,home_team_id和away_team_id是teams数据库中id的外键。我想要做的是输出匹配ID以及与匹配数据库中的id相关联的团队名称。预期产出:
match_id home_team_name away_team_name
---------------------------------------------------
1 Arsenal Aston Villa
目前我有两个选择陈述。
SELECT match_id, name as home_team_name
FROM matches, teams
WHERE home_team_id = id;
SELECT match_id, name as away_team_name
FROM matches, teams
WHERE away_team_id = id;
第一个选择语句输出匹配ID和主队名称,第二个输出匹配ID和客队名称。
有没有办法用我当前的数据库设计实现所需的输出?
答案 0 :(得分:3)
你可以这样做:
SELECT m.id, t1.name as home_team_name, t2.name as away_team_name
FROM `match` m
INNER JOIN teams t1 ON t1.id = m.home_team_id
INNER JOIN teams t2 ON t2.id = m.away_team_id
这将两次匹配表与球队表,以获得两个球队的名字。
请注意,我正在逃避`match`
,因为它是reserved word
答案 1 :(得分:0)
如果为它们定义别名,则可以在from子句中多次使用一个表(只能保留一个没有别名的表,因此表名用作别名)。
所以就这样做:
select *
from matches
join teams t1 on t1.id = matches.home_team_id
join teams t2 on t2.id = matches.away_team_id
或者你可以这样做
select *
from matches, teams t1, teams t2
where t1.id = matches.home_team_id and t2.id = matches.away_team_id
并且使用ANSI JOIN(第一种语法)要好得多,它更具可读性,并且当表的数量增加时会有一些左/右连接,可以处理丑陋的事情。