MySQL - 在输出时获取表上的重复行与关系表连接

时间:2012-12-23 00:24:11

标签: php mysql join duplicates

我正在创建一个音乐网站,其中将有一个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>

2 个答案:

答案 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'];
 }

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