0

新しい曲を追加するためのCMSがある音楽サイトを作成しています。訪問者はニュースフィードで曲を表示/再生したり、アーティスト/曲で閲覧/検索したりできます。以降、曲をトラックと呼びます。

データベースは次のようになります。

トラック

id | タイトル| アーティスト| 年| path_mp3 | path_ogg | 日付時刻

アーティスト

id | アーティスト(後でアーティスト情報を追加したいので、このテーブルがあります。)

track2artist

track_id | Artist_id

一部のトラックには2人以上のアーティストがいて、それらのアーティストにはそれぞれ独自のソロトラックもあります。したがって、ユーザーがそれに応じてそれらを参照できるように、これらのアーティストを別々のエンティティとして保持したいと思いますが、該当する場合は、複数のアーティストが同じ曲を担当していることを示します。

複数のアーティストがいるニュースフィードにトラックを出力する場合、両方のアーティストが貢献したトラックのみを取得するページにリンクし、そのページから、訪問者がアーティストの1つをクリックすると、に移動します。個々のアーティストのページ。

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

たとえば、このリンクをクリックして上位の検索結果を選択すると、私が探している効果を確認できます。アーティストのリンクは、ランディングページで個別に表示されます。

現在のコードで得ているのは、track2artistテーブルに複数のエントリがあるトラック(複数のアーティストがいることによる)が複数回表示されていることです。各トラックを1回だけ発生させたいのですが、複数のアーティストがいるかどうか、およびそのIDが何であるかをまだ把握しておいてください。

sqlステートメントの最後に「groupbytracks.id」を含めてみましたが、実際には各ステートメントが1回だけ選択されます。ただし、これは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>
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

別のテーブルに複数の作者がいる曲があるので、トラックを複数回リストすることになります。[行を異なるものにするデータごとに1回]

返して欲しいものはこんな感じ

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

これにより、配列が期待どおりの形式になります。ところで、各トラックに関連付けられているすべてのアーティストを表示するには、トラック配列内のアーティスト配列を反復処理する必要があります。

于 2012-12-23T00:49:05.827 に答える