2016-04-03 23 views
2

アルバムを選択すると、アーティストの詳細を表示しようとしています。しかし同時に、アーティストに関連する他のアルバムも表示されるはずです。これを達成する方法はありますか?同じArtistIDであるが異なるCDIDを持つレコードを選択するMySQLクエリ

左の列はCDID、右列はARTISTIDあります。

これは私の現在のMySQLのコードです:

<?php 

require "pdoDB.php"; 
$albumtitle = $_GET['title']; 
$db = database::connect(); 
$artistsql = "SELECT a.artistName, p.pubName, cd.CDTitle FROM tiptop_artist a 
      INNER JOIN tiptop_artistcd acd ON a.artistID = acd.artistID 
      INNER JOIN tiptop_cd cd ON cd.CDID = acd.CDID 
      INNER JOIN tiptop_publisher p ON p.pubID = cd.pubID 
      WHERE cd.CDTitle = ?"; 
$stmt = $db->prepare($artistsql); 
// $stmt->bindParam("catid", $categoryid); 
$stmt->execute(array($albumtitle)); 

echo "<table> 
<tr> 
<th>Artist Name</th> 
<th>Publisher</th> 
<th>Other Album</th> 
</tr>"; 

while ($row=$stmt->fetch(PDO::FETCH_ASSOC)) { 
    echo "<tr style=\"cursor: pointer;\">"; 
    // echo "<td>" . $row1['artistName'] . "</td>"; 
    echo "<td>" . $row['artistName'] . "</td>"; 
    echo "<td>" . $row['pubName'] . "</td>"; 
    echo "<td>" . $row['CDTitle'] . "</td>"; 
    echo "</tr>"; 
} 

?> 

最終的な出力は次のように取得する必要があります。

artist name | publisher | related albums by the artist 
------------------------------------------------------ 
hardwell | sony music| I am hardwell 
         | Spaceman 

を事前にありがとうございます。

+0

アーティストの詳細はどのテーブルに保存されていますか? – prograhammer

+0

最終的な出力を取得しようとしているものの例を追加する必要があります。いくつかの行のデータと詳細を表示する場所を示した概略の例です。これまでのところ、あなたが行ったことを私たちに見せてもらったことがありますが、あなたが何を求めているのかはまだ分かりません。 – prograhammer

+0

ok私はもう一度私の質問を編集します – anonymous5671

答えて

0

これは、単一のクエリまたは複数のクエリでこれを実現する方法がいくつかあります。ある時点で、どのクエリが最も効果的かを確認するために、さまざまなクエリ戦略を比較する必要があります。

(注意:以下の例では、あなたはおそらくそれが2番目のクエリを実行する前に結果を返すことを確認するために最初のクエリの後のチェックを追加したいと思う)

はここで2つのクエリを使用した例です:ここで別の巧妙な(そしておそらくよりパフォーマンスだ

SELECT artist.name as 'artist.name', 
     publisher.name as 'publisher.name', 
     cd.title as 'cd.title', 
     albums.title as 'albums.title' 
FROM tiptop_cd as cd 
INNER JOIN tiptop_artistcd as artistcd ON(artistcd.cd_id = cd.id) 
INNER JOIN tiptop_artist as artist ON(artist.id = artistcd.artist_id) 
INNER JOIN tiptop_publisher as publisher ON(publisher.id = cd.publisher_id) 
INNER JOIN tiptop_artistcd as artistcd2 ON(artistcd2.artist_id = artist.id) 
INNER JOIN tiptop_cd as albums ON(albums.id = artistcd2.cd_id) 
WHERE cd.title = :title 

:ここ

$sql = "SELECT artist.name as 'artist.name', 
       artist.id as 'artist.id', 
       publisher.name as 'publisher.name', 
       cd.title as 'cd.title', 
       cd.id as 'cd.id' 
     FROM tiptop_cd as cd 
     INNER JOIN tiptop_artistcd as artistcd ON(artistcd.cd_id = cd.id) 
     INNER JOIN tiptop_artist as artist ON(artist.id = artistcd.artist_id) 
     INNER JOIN tiptop_publisher as publisher ON(publisher.id = cd.publisher_id) 
     WHERE cd.title = :title"; 

$stmt = $db->prepare($artistsql); 
$stmt->bindParam(":title", $_GET['title']); 
$stmt->execute(); 
$details = $stmt->fetch(PDO::FETCH_ASSOC); 

$sql = "SELECT cd.title as 'cd.title' 
     FROM tiptop_artistcd as artistcd 
     INNER JOIN tiptop_cd as cd ON(cd.id = artistcd.cd_id AND cd.id != :cd_id) 
     WHERE artistcd.artist_id = :artist_id"; 

$stmt = $db->prepare($artistsql); 
$stmt->bindParam(":artist_id", $details['artist.id']); 
$stmt->bindParam(":cd_id", $details['cd.id']); 
$stmt->execute(); 

echo "<table>". 
    "<tr>". 
    "<th>Artist Name</th>". 
    "<th>Publisher</th>". 
    "<th>Other Album</th>". 
    "</tr>". 

    "<tr>". 
    "<td>".$details['artist.name']."</td>". 
    "<td>".$details['publisher.name']."</td>". 
    "<td>".$details['cd.title']."</td>". 
    "</tr>"; 

while ($album = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    echo "<tr style=\"cursor: pointer;\">"; 
    echo "<td></td>"; 
    echo "<td></td>"; 
    echo "<td>" . $album['cd.title'] . "</td>"; 
    echo "</tr>"; 
} 

echo "</table"; 

は、単一のクエリバージョンです)1つのクエリでそれを行う方法。返される最初の行には、詳細と現在選択されているCD、残りの行には他のアルバムが含まれます:

SELECT artist.name as 'artist.name', 
     publisher.name as 'publisher.name', 
     cd.title as 'cd.title', 
     IF(cd.title = :title, 1, 0) as selected 
FROM tiptop_cd as cd 
INNER JOIN tiptop_artistcd as artistcd ON(artistcd.cd_id = cd.id) 
INNER JOIN tiptop_artist as artist ON(artist.id = artistcd.artist_id) 
INNER JOIN tiptop_publisher as publisher ON(publisher.id = cd.publisher_id) 
ORDER BY selected DESC 
+0

そのすべてのアーティスト名を表示..私は関連するアルバムのみを表示したいアーティストだけ – anonymous5671

+0

私は最初のクエリを試みたが、私はオフセット0を取得していない – anonymous5671

+0

@ anonymous5671ああ、申し訳ありませんが、私は答えを更新しました。 '$ details = $ stmt-> fetch(PDO :: FETCH_ASSOC);を直接実行してください。 – prograhammer

関連する問題