2017-03-08 64 views
1

我想让我的头部缠绕连接。 我尝试了许多连接但没有成功。根据第三个主表查询2个表格

考虑以下表:

Allsongs

+--------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+--------+--------------+------+-----+---------+-------+ 
| ID  | int(11)  | NO | PRI | NULL |  | 
| Artist | varchar(100) | YES |  | NULL |  | 
| Title | varchar(100) | YES |  | NULL |  | 
+--------+--------------+------+-----+---------+-------+ 

几个不同的艺术家表:即猫王,披头士等

+--------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+--------+---------+------+-----+---------+-------+ 
| ID  | int(11) | NO | PRI | NULL |  | 
| Songid | int(11) | YES |  | NULL |  | 
+--------+---------+------+-----+---------+-------+ 

在艺术家表中的Songid场是相同的allsongs .id字段

我想创建一个查询th在将加入以下查询到一个查询

select s.title from allsongs s 
join beatles b ON s.id = b.songid; 

select s.title from allsongs s 
join elvis e ON s.id = e.songid; 

我想这可能工作:

select s.title from allsongs s 
join beatles b ON s.id = b.songid 
join elvis e ON s.id = e.songid; 

但它提供了:空集。

如果我使用LEFT OUTER JOIN它做什么,我想只要我限制我希望我是不够清晰的行数手动

。任何帮助,将不胜感激。

谢谢

回答

0

你可以用union来做到这一点。两个查询都需要以相同的数据类型顺序返回相同数量的列。列名来自第一个选择语句,以防您想通过之后的任何类似命令执行命令。

(select s.title from allsongs s 
join beatles a ON s.id = a.songid) 
union all 
(select s.title from allsongs s 
join elvis a ON s.id = a.songid); 
+0

优秀。这工作除了一个问题。结果是其中一个标题是两个艺术家,因此它只返回其中的一个。有没有办法解决这个问题呢,还是仅仅是由于表结构? – Pete

+0

将其更改为“UNION ALL”而不是工会。这将显示重复的行。 – Ilion