将两个 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 语句连接到一个表中的主要内容,如果未能解决你的问题,请参考以下文章

Redshift:连接到由表中的 SELECT * 组成的子查询/CTE 相当于连接表本身,还是性能下降?

MySQL连接两个不相关查询的结果

SQL多表链接查询、嵌入SELECT语句的子查询技术

SQL连接两个SELECT语句的麻烦

使用 codeigniter 将连接表中的列连接到另一列

mysql - 如何使用父表中的值将连接表连接到另一个连接表?