2012-12-23 53 views
0

我正在制作一个音乐网站,其中将有一个CMS添加新歌曲,访问者可以在新闻Feed中查看/播放歌曲或浏览/按艺术家/歌曲搜索。歌曲从这里被称为曲目。MySQL - 获取重复表格在输出时加入关系表

数据库如下所示:

轨道

ID |标题|艺术家|年| | path_mp3 | path_ogg |日期时间

艺术家

ID |艺术家(我有这个表,因为我想将来添加更多的艺术家信息。)

track2artist

track_id | artist_id

有些曲目有两个或两个以上的艺术家,这些艺术家每个都有自己的独奏曲目。因此,我希望将这些艺术家保持为独立的实体,以便用户可以相应地浏览他们,但在适用的情况下,会显示多位艺术家对同一首歌曲负责。

当我在具有多个艺术家的新闻Feed中输出曲目时,我想链接到只抓取两位艺术家贡献的曲目的页面,并且如果访问者点击其中一位艺术家,去个别艺术家页面。

http://www.discogs.com/search?q=cid+inc+and+victor+hugo&type=all

例如,如果你点击这个链接并选择顶部的搜索结果,你可以看到我在寻找的效果。艺术家链接在着陆页上是分开的。

我用我当前的代码得到的是,track2artist表中有多个条目的轨道(通过具有多个艺术家)正在多次显示。我希望每首歌都只出现一次,但是如果有多位艺术家,以及他们的ID是什么,它仍然是众所周知的。

我曾尝试在sql语句的末尾包括“group by tracks.id”,它实际上只选择一次每条语句。然而,这并没有选取track2artist中的多个artist_id条目,所以当用户点击时我无法传递这些多个艺术家ID。

我需要新的SQL语法,还是在我的PHP?我试图摆脱尽可能少的数据库调用,因为我知道这是推荐的。

我欣赏这方面的任何帮助。这可能在其他地方有所涉及,但在搜索时,我在试图理解其他示例时感到困惑。感谢您抽时间阅读。

$conn = dbConnect('read'); 

$sql = "SELECT * FROM tracks INNER JOIN track2artist ON tracks.id = track2artist.track_id"; 
$result = $conn->query($sql) or die (mysqli_error($conn)); 
?> 
<table id="feed"> 
    <?php 
    while($track = $result->fetch_assoc()) {  
    ?> 
     <tr> 
     <td><a href="javascript:;" id="playlist-add-track-id-<?php echo $track['id']; ?>"> 
     <img src="/assets/img/add_track.gif" class="add_track_icon"></a></td> 
     <td><?php echo $track['title']; ?> by <a href="/?page=artist&artist_id=<?php echo $track['artist_id']; ?>"> 
     <?php echo $track['artist']; ?></a></td> 
     </tr> 

<?php } ?> 
</table> 

回答

0

由于您有多个作者在不同表格中的歌曲,因此您会将曲目列出多次,然后再列出一次。[一次为每个数据块,使得不同的行]你想要什么返回

是这样

track   artist 
       artist 
       artist 

track   artist 
       artist 

track   artist 

track   artist 

然而,MySQL将只返回整行表示每一块数据它会返回一个完整一排信息。为了保持低的查询,最好在数据库返回信息之后对信息进行分组。

我想说的,而不是输出向右走,把这个作为你的数据库解析循环

<?php 
while($track = $result->fetch_assoc()) { 
     $tracklist[$track['id']]['title'] = $track['title']; 
     $tracklist[$track['id']]['artists'][$track['artist_id']] = $track['artist']; 
} 

这会紧缩您的阵列到你希望找到的格式,顺便说一句,你也将有遍历与音轨阵列中的艺术家阵列一起显示与每个音轨关联的所有艺术家。

+0

这看起来很有希望。其实我只是从轨道表中删除了艺术家专栏,因为它是多余的。我如何修改我的sql语句以加入到艺术家表中? –

+0

明白了:刚刚在最后加入了另一个INNER JOIN。现在得到这个工作。非常感谢您的快速帮助...爱堆栈溢出! –

0

使用DISTINCT关键字,在加入时将不会返回重复。

$sql = "SELECT DISTINCT * FROM tracks INNER JOIN track2artist ON tracks.id = track2artist.track_id"; 
+0

我只是复制/粘贴到我的mysql终端,它返回重复行的轨道,有多个艺术家,我猜,因为他们根据artist_id列不同...:/ –

+0

然后加入他们使用艺术家ID不是曲目编号 – kennypu