2012-12-23 102 views
0

我正在製作一個音樂網站,其中將有一個CMS添加新歌曲,訪問者可以在新聞Feed中查看/播放歌曲或瀏覽/按藝術家/歌曲搜索。歌曲從這裏被稱爲曲目。MySQL - 獲取重複表格在輸出時加入關係表

數據庫如下所示:

軌道

ID |標題|藝術家|年| | path_mp3 | path_ogg |日期時間

藝術家

ID |藝術家(我有這個表,因爲我想將來添加更多的藝術家信息。)

track2artist

track_id | artist_id

有些曲目有兩個或兩個以上的藝術家,這些藝術家每個都有自己的獨奏曲目。因此,我希望將這些藝術家保持爲獨立的實體,以便用戶可以相應地瀏覽他們,但在適用的情況下,會顯示多位藝術家對同一首歌曲負責。

當我在具有多個藝術家的新聞Feed中輸出曲目時,我想鏈接到只抓取兩位藝術家貢獻的曲目的頁面,並且如果訪問者點擊其中一位藝術家,去個別藝術家頁面。

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

例如,如果你點擊這個鏈接並選擇頂部的搜索結果,你可以看到我在尋找的效果。藝術家鏈接在着陸頁上是分開的。

我用我當前的代碼得到的是,track2artist表中有多個條目的軌道(通過具有多個藝術家)正在多次顯示。我希望每首歌都只出現一次,但是如果有多位藝術家,以及他們的ID是什麼,它仍然是衆所周知的。

我曾嘗試在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

由於您有多個作者在不同表格中的歌曲,因此您會將曲目列出多次,然後再列出一次。[一次爲每個數據塊,使得不同的行]你想要什麼返回

是這樣

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

這會緊縮您的陣列到你希望找到的格式,順便說一句,你也將有遍歷與音軌陣列中的藝術家陣列一起顯示與每個音軌關聯的所有藝術家。

+0

這看起來很有希望。其實我只是從軌道表中刪除了藝術家專欄,因爲它是多餘的。我如何修改我的sql語句以加入到藝術家表中? –

+0

明白了:剛剛在最後加入了另一個INNER JOIN。現在得到這個工作。非常感謝您的快速幫助...愛堆棧溢出! –

0

使用DISTINCT關鍵字,在加入時將不會返回重複。

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

我只是複製/粘貼到我的mysql終端,它返回重複行的軌道,有多個藝術家,我猜,因爲他們根據artist_id列不同...:/ –

+0

然後加入他們使用藝術家ID不是曲目編號 – kennypu