我正在创建一个音乐网站,其中将有一个CMS来添加新歌曲,访问者可以在新闻源上查看/播放歌曲或按艺术家/歌曲浏览/搜索。歌曲从这里开始称为曲目。
数据库如下所示:
轨道
id |标题|艺术家|一年| path_mp3 | path_ogg | DATE_TIME
艺术家
id |艺术家(我有这张桌子,因为我想稍后添加其他艺术家信息。)
track2artist
track_id | artist_id
有些曲目有两个或更多艺术家,每个艺术家都有自己的独奏曲目。因此,我希望将这些艺术家作为单独的实体保存,以便用户可以相应地浏览它们,但在适用的情况下,表明多位艺术家负责同一首歌。
当我在包含多位艺术家的新闻Feed上输出曲目时,我想链接到一个页面,该页面仅抓取两位艺术家所贡献的曲目,如果访问者点击其中一位艺术家,则从该页面抓取转到个别艺术家页面。
http://www.discogs.com/search?q=cid+inc+and+victor+hugo&type=all
例如,如果您单击此链接并选择顶部搜索结果,则可以看到我正在寻找的效果。艺术家链接在着陆页上是分开的。
我使用当前代码得到的是,track2artist表中有多个条目的轨道(通过拥有多个艺术家)会多次显示。我希望每个曲目只出现一次,但是如果有多位艺术家,他们仍然知道他们的ids是什么。
我尝试在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 :(得分:1)
使用DISTINCT
关键字,在加入时不会返回重复项。
$sql = "SELECT DISTINCT * FROM tracks INNER JOIN track2artist ON tracks.id = track2artist.track_id";
答案 1 :(得分:0)
由于您在不同的表格中有多位作者的歌曲,因此您将列出的曲目超过一次。 [对于使行不同的每一条数据一次]
你想要的东西是这样的
track artist
artist
artist
track artist
artist
track artist
track artist
然而,mysql只会返回FULL ROWS,这意味着对于每个数据,它将返回一整行信息。为了保持低查询,最好在数据库返回信息后对信息进行分组。
我会说不是立即输出,而是将其作为数据库解析循环
<?php
while($track = $result->fetch_assoc()) {
$tracklist[$track['id']]['title'] = $track['title'];
$tracklist[$track['id']]['artists'][$track['artist_id']] = $track['artist'];
}
这会将你的数组压缩成你期望找到的格式,顺便说一句,你还必须在轨道数组中迭代艺术家数组,以显示与每个轨道相关的所有艺术家。