将两个 SELECT 语句连接到一个表中
Posted
技术标签:
【中文标题】将两个 SELECT 语句连接到一个表中【英文标题】:Joining two SELECT statements into one table 【发布时间】:2013-11-19 16:45:33 【问题描述】:我正在尝试将两个单独的 SQL 语句的输出合并到一个表中。我在一个数据库中有一个团队名称列表和关联的 id,另一个数据库在另一个数据库中有一个匹配列表。例如
Teams
-----------------
id name
1 Arsenal
2 Aston Villa
Matches
--------------------------------
id home_team_id away_team_id
1 1 2
在matches 数据库中,home_team_id 和 away_team_id 是teams 数据库中id 的外键。我想要做的是输出匹配 id 以及与匹配数据库中的 id 关联的团队名称。预期输出:
match_id home_team_name away_team_name
---------------------------------------------------
1 Arsenal Aston Villa
我现在有两个 select 语句。
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;
第一个 select 语句输出比赛 id 和主队名称,第二个输出比赛 id 和客队名称。
我当前的数据库设计有什么方法可以实现所需的输出吗?
【问题讨论】:
【参考方案1】:你可以这样做:
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
这将匹配表与团队表连接两次,以获得两个团队的名称。
sqlfiddle demo
请注意,我正在转义 `match`
,因为它是 reserved word
【讨论】:
【参考方案2】:如果为表定义别名,则可以在 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(第一种语法)要好得多,它更具可读性,并且当表的数量随着一些左/右连接而增加时,它可以处理丑陋的事情。
【讨论】:
以上是关于将两个 SELECT 语句连接到一个表中的主要内容,如果未能解决你的问题,请参考以下文章