2009-10-01 53 views
0

這很混亂;似乎我需要至少有一個多對多的關係。MySQL:如何存儲/檢索藝術家信息?

  1. 一個曲目可能會被2+藝術家唱出 - 我如何將它存儲在數據庫中?
  2. 顯示該曲目時,我想鏈接到每位藝術家,以便當用戶點擊曲目時,會打開該藝術家的個人檔案頁面。

任何人都可以提供一些幫助來設計一個或多個類來完成這個任務嗎?

+0

你試過了什麼? – SilentGhost 2009-10-01 15:36:02

+0

這種作業的氣味。作爲兩個答案的狀態多對多的關係。 – 2009-10-01 15:43:52

回答

2

嘗試類似的東西

 
tblSongs 
    SongId 
    Title 
    YearProduced 
    etc. 

tblArtist 
    ArtistId 
    Name 
    ProfilePage 
    etc.. 

tblSongArtists 
    SongId 
    ArtistId 

然後你的查詢可能看起來像

SELECT Title, YearProduced, Name, ProfilePage 
FROM tblSongs S 
LEFT OUTER JOIN tblSongArtists SA ON SA.SongId = S.SongId 
LEFT OUTER JOIN tblArtists A ON A.ArtistId = SA.ArtistId 
WHERE Title = 'I got the blues' -- .... 
ORDER BY SongId -- or Song Title (*) 

(*)ORDER BY子句中的情況下,搜索標準生產超過一首歌,如果你希望保留給定歌曲的藝術家的順序。
這樣的查詢會爲多首歌曲創作多首歌曲,每首歌曲一首歌曲,重複播放tblSongs中列的值。

+0

我也在我的專輯表中添加artist_id ... n也在軌道表中..我錯了嗎? – sunidhi 2009-10-01 16:40:42

+0

我認爲專輯表中沒有使用artist_id ......它變得混亂。 – sunidhi 2009-10-01 16:42:52

+1

@sunidhi添加(或不添加)artist_id到專輯表...這是要避免的,因爲我假設有可能讓_serveral_藝術家與給定專輯關聯。然後,您將需要一個tblAlbumArtists表(類似於tblSongArtists),或者間接地選擇某個'專輯'的藝術家列表:tblAlbums - > tblbSongs - > thlSongArtists - > tblArtists在這樣的查詢中,您會需要使用DISTINCT,因此您只能將每位藝術家列出一次,即使他/她可能與該專輯的幾首歌有關。 – mjv 2009-10-01 17:37:36

1

任何多對多的關係都需要三張表。對於你的例子:

Song<br/> 
Name SongID 

Artist <br/> 
Name ArtistID 

ArtistsInSongs <br/> 
ArtistID SongID 

我會讓你找出其餘的。

0
public static function find_artist_on($track_id=0) { 
    global $database; 
    $sql = "SELECT * FROM " . self::$table_name ." s " ; 
    $sql .= "LEFT OUTER JOIN trackartist TA ON TA.track_id =s.track_id"; 
    $sql .= "LEFT OUTER JOIN artist A ON A.artist_id =TA.artist_id"; 
    $sql .= " WHERE s.artist_id=" .$database->escape_value($track_id); 
    $sql .= " ORDER BY artist_id ASC"; 
    return self::find_by_sql($sql); 
    } 
相關問題