0

我正在制作一个音乐网站,其中将有一个 CMS 来添加新歌曲,访问者可以在新闻源上查看/播放歌曲或按艺术家/歌曲浏览/搜索。从这里开始,歌曲被称为曲目。

数据库如下所示:

轨道

编号 | 标题 | 艺术家 | 年份 | 路径_mp3 | 路径_ogg | 约会时间

艺术家

编号 | 艺术家(我有这张表,因为我想稍后添加其他艺术家信息。)

track2艺术家

track_id | 艺术家 ID

有些曲目有两个或更多的艺术家,这些艺术家每个人都有自己的独奏曲目。因此,我想将这些艺术家保留为单独的实体,以便用户可以相应地浏览它们,但在适用时,显示多个艺术家对同一首歌曲负责。

当我在包含多个艺术家的新闻提要上输出曲目时,我想链接到一个页面,该页面仅抓取两位艺术家贡献的曲目,如果访问者点击其中一位艺术家,则从该页面转到个人艺术家页面。

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

比如你点击这个链接,选择最上面的搜索结果,就可以看到我要找的效果。艺术家链接在登录页面上是分开的。

我当前的代码得到的是,在 track2artist 表中有多个条目(通过有多个艺术家)的曲目被多次显示。我希望每首曲目只出现一次,但仍然知道是否有多个艺术家,以及他们的 id 是什么。

我已经尝试在 sql 语句的末尾包含“group by tracking.id”,它实际上只选择每个语句一次。但是,这无法在 track2artist 中获取任何多个艺术家 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>
4

2 回答 2

1

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

$sql = "SELECT DISTINCT * FROM tracks INNER JOIN track2artist ON tracks.id = track2artist.track_id";
于 2012-12-23T00:32:56.990 回答
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'];
 }

这会将您的数组压缩成您期望找到的格式,顺便说一句,您还必须在轨道数组中迭代艺术家数组以显示与每个轨道关联的所有艺术家。

于 2012-12-23T00:49:05.827 回答