2017-10-09 43 views
0

我已经使用我学过的常规形式重建了我的数据库,但现在我遇到了将它们连接回所有表的问题。加入多个表并显示从ID链接的所有名称

我有一首歌数据库,表的连接是这样的连接:

songs   artists   song_vocals   song_composers 
-------------------------------------------------------------------- 
song_id  artist_id   song_id    song_id 
title   artist_name  artist_id   artist_id 

有与他们的外键指向艺术家表中的多个表。

我要显示所有这样的名称的信息,我不想通过ID显示出来:

song_id  title   vocal   composer 
-------------------------------------------------------- 
1    ABC   John   Cat 

到目前为止,我所能做的最好是左侧的接合部3个表,其中只给出我song_id标题声乐

SELECT songs.song_id, songs.title, artists.artist_name as vocal FROM songs 
LEFT JOIN song_vocals ON 
song_vocals.song_id = songs.song_id 
left join artists ON 
song_vocals.artist_id = artists.artist_id 

我怎么能加入吗?

回答

0
SELECT 
songs.title as SongTitle, 
a1.artist_name as Vocal, 
a2.artist_name as Composer 
FROM songs 
left join song_vocals ON song_vocals.song_id = songs.song_id 
left join artists a1 ON song_vocals.artist_id = a1.artist_id 
left join song_composers on songs.song_id = song_composers.song_id 
left join artists a2 on a2.artist_id = song_composers.artist_id 

这之间的区别是,你应该使用的代码块。 如果您有两个或两个以上指向表的链接,那么如果您使用ALIAS,则可以多次使用该表。 在你的前。 “a1”,“a2”是你的别名

+0

感谢它的运作。例如,对于由多位艺术家演唱的歌曲,我还有另外一个问题,现在选区会将它们显示为多行,如何将它们合并成一行? – reddy

+0

因为你需要使用动态sql,所以你可以添加一个接一个的名字,给一个小例子,你将不得不写一个查询,如@vocal = @ vocal +''+ @ vocal2 – JurgenHakanHifzi

0

如果你还没有这样做,你可以为作曲家创建一张表,然后在你的声明中添加外键的song_vocals表是你的主表。然后,您可以在艺术家之后为作曲家表添加另一个左连接,但不要忘记将composers.composer_name(我假设)也放在您的选择语句中。

+0

song_composers表已经创建好了,它的名字引用了artists表。如果我要创建另一个作曲家表来存储名称,那么这将是名称的冗余问题,因为我已经将它们存储在艺术家表中。 – reddy

+0

您仍然可以使用艺术家表格左加入作曲家表格,但在选择语句中给名称赋予不同的别名,这样您就不会感到困惑。 您还可以通过创建名称表进一步标准化艺术家表格,并将名称标识存储在艺术家和作曲家表格中,这样您最终将拥有2个联结表引用名称表,但这可能会更具反作用性,因为我们不会不知道你的情况和数据库模式的全貌。 – Arkhaine

0

是什么表song_vocals和song_composer

+0

song_vocals存储歌曲的歌手,song_composer存储歌曲的作曲者。可以有多个歌手唱同一首歌或多首作曲家写一首歌。 – reddy

相关问题