【问题标题】:MySQL: How to store/retrieve artist information?MySQL:如何存储/检索艺术家信息?
【发布时间】:2009-10-01 15:32:02
【问题描述】:

这很令人困惑;看来我需要至少有一个多对多关系。

  1. 一首曲目可能由 2 位以上的艺术家演唱 - 我如何将其存储在数据库中?
  2. 在显示该曲目时,我希望链接到每个艺术家,以便当用户单击该曲目时,它会打开该艺术家的个人资料页面。

谁能帮我设计一个或多个类来完成这个任务?

【问题讨论】:

  • 这是作业的味道。两个答案都说明了多对多关系。

标签: php sql mysql


【解决方案1】:

试试类似的方法

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 的列的值。

【讨论】:

  • 我还在我的专辑表中添加了艺术家 ID...n 也在曲目表中......我错了吗?
  • 我认为专辑表中没有使用artist_id...它变得令人困惑。
  • @sunidhi 在添加(或不添加)artist_id 到专辑表...这是要避免的,因为我假设可能有 serveral 个艺术家关联与给定的专辑。然后,您将需要一个 tblAlbumArtists 表(类似于 tblSongArtists),或者间接选择艺术家列表 [对于给定专辑] 像这样:tblAlbums -> tblbSongs -> thlSongArtists -> tblArtists 在这样的查询中,您会需要使用 DISTINCT,因此您只能将每个艺术家列出一次,即使他/她可能与专辑中的几首歌曲有关。
  • 请检查我在此添加的功能作为下面的答案
【解决方案2】:

任何多对多关系都需要三个表。以您为例:

Song<br/> 
Name  SongID

Artist <br/>
Name  ArtistID

ArtistsInSongs <br/>
ArtistID SongID

我会让你弄清楚其余的。

【讨论】:

    【解决方案3】:
    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);
        }
    

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多