Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL-在输出时获取表上的重复行与关系表连接_Php_Mysql_Join_Duplicates - Fatal编程技术网

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

Php MySQL-在输出时获取表上的重复行与关系表连接,php,mysql,join,duplicates,Php,Mysql,Join,Duplicates,我正在制作一个音乐网站,其中将有一个CMS来添加新歌,访问者可以在新闻提要上查看/播放歌曲,或者通过艺术家/歌曲浏览/搜索歌曲。从现在起,歌曲被称为曲目 数据库如下所示: 轨道 id |头衔|艺术家|年份|路径| mp3 |路径| ogg |日期|时间 艺术家 id |艺术家(我有这个表,因为我想稍后添加其他艺术家信息。) 田径运动员 曲目|艺术家| id 有些曲目有两个或两个以上的艺术家,这些艺术家也有各自的独奏曲目。因此,我希望将这些艺术家作为单独的实体,以便用户可以相应地浏览到他们,但在适

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

数据库如下所示:

轨道

id |头衔|艺术家|年份|路径| mp3 |路径| ogg |日期|时间

艺术家

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

田径运动员

曲目|艺术家| id

有些曲目有两个或两个以上的艺术家,这些艺术家也有各自的独奏曲目。因此,我希望将这些艺术家作为单独的实体,以便用户可以相应地浏览到他们,但在适用的情况下,显示多个艺术家负责同一首歌曲

当我在新闻提要上输出一个包含多个艺术家的曲目时,我想链接到一个页面,该页面只获取两位艺术家都参与的曲目,如果访问者单击其中一位艺术家,则从该页面转到个人艺术家页面

例如,如果您单击此链接并选择顶部搜索结果,您可以看到我正在寻找的效果。艺术家链接在登录页上是分开的

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

我已经尝试在sql语句的末尾包含“groupbytracks.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>
$conn=dbConnect('read');
$sql=“SELECT*FROM tracks INNER JOIN track2artist ON tracks.id=track2artist.track_id”;
$result=$conn->query($sql)或die(mysqli_error($conn));
?>
通过

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

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

由于在不同的表中有多个作者的歌曲,因此将多次列出曲目。[对于使行不同的每段数据一次]

你想要的是这样的东西

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

我刚刚将其复制/粘贴到我的mysql终端中,它返回了多个艺术家的曲目的重复行,我猜是因为艺术家id列不同…:/然后使用艺术家id加入他们。这看起来很有希望。实际上,我刚刚从tracks表中删除了artist列,因为它是多余的。我如何修改我的sql语句以加入到artists表中?明白了:只是在末尾添加了另一个内部连接。现在可以用了。非常感谢您的快速帮助。。。爱栈溢出!