2009-10-01 32 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); 
    } 
相关问题