【发布时间】:2009-10-01 15:32:02
【问题描述】:
这很令人困惑;看来我需要至少有一个多对多关系。
- 一首曲目可能由 2 位以上的艺术家演唱 - 我如何将其存储在数据库中?
- 在显示该曲目时,我希望链接到每个艺术家,以便当用户单击该曲目时,它会打开该艺术家的个人资料页面。
谁能帮我设计一个或多个类来完成这个任务?
【问题讨论】:
-
这是作业的味道。两个答案都说明了多对多关系。
这很令人困惑;看来我需要至少有一个多对多关系。
谁能帮我设计一个或多个类来完成这个任务?
【问题讨论】:
试试类似的方法
tbl歌曲 歌曲编号 标题 年份制作 等等 tbl艺术家 艺术家 ID 姓名 个人资料页 ETC.. tblSongArtists 歌曲编号 艺术家 ID那么您的查询可能类似于
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 的列的值。
【讨论】:
任何多对多关系都需要三个表。以您为例:
Song<br/>
Name SongID
Artist <br/>
Name ArtistID
ArtistsInSongs <br/>
ArtistID SongID
我会让你弄清楚其余的。
【讨论】:
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);
}
【讨论】: