2017-10-09 70 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

相關問題