2016-04-03 2 views
2

Ich versuche, die Künstlerdetails anzuzeigen, sobald das Album ausgewählt ist. Gleichzeitig sollten aber auch die anderen mit dem Künstler verbundenen Alben angezeigt werden. Gibt es einen Weg, dies zu erreichen?Mysql Abfrage, um Datensatz mit derselben artistID, aber anderen CDID

Die linke Spalte ist die CDID und die rechte Spalte ist die artistID.

Dies ist mein aktueller MySQL-Code:

<?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>"; 
} 

?> 

Die endgültige Ausgabe in etwa so erhalten soll:

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

Vielen Dank im Voraus.

+0

In welcher Tabelle sind die Künstlerdaten gespeichert? – prograhammer

+0

Sie sollten ein Beispiel hinzufügen, was die endgültige Ausgabe sein würde, die Sie erhalten möchten. Nur ein grobes Entwurfsbeispiel mit ein paar Datenzeilen und wo die Details angezeigt werden sollen. Bis jetzt haben Sie uns gezeigt, was Sie getan haben, aber es ist immer noch nicht klar, welche Ausgabe Sie wollen. – prograhammer

+0

ok ich werde meine Frage noch einmal bearbeiten – anonymous5671

Antwort

0

Es gibt einige Möglichkeiten, wie Sie dies in einer einzelnen Abfrage oder in mehreren Abfragen erreichen können. Möglicherweise müssen Sie zu einem bestimmten Zeitpunkt verschiedene Abfragestrategien vergleichen, um zu sehen, welche die leistungsstärkste ist.

(Anmerkung:. Im Beispiel unten, werden Sie wahrscheinlich eine Prüfung nach der ersten Abfrage hinzufügen möchten Ergebnisse zurück, um sicherzustellen, bevor die zweite Abfrage ausgeführt wird)

Hier ist ein Beispiel mit zwei Abfragen:

$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"; 

Hier ist eine einzelne Abfrage Version:

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 

Hier ist eine andere clever (und möglicherweise mehr performant) Möglichkeit, dies in einer einzigen Abfrage zu tun. Die erste zurückgegebene Zeile enthält Ihre Details und die aktuell ausgewählte CD und die verbleibenden Zeilen die anderen Alben:

+0

seine Anzeige aller Künstlername .. ich will es nur die damit verbundenen Alben anzeigen der Künstler nur – anonymous5671

+0

ich versuchte die erste Abfrage, aber ich bekomme undefined Offset 0 – anonymous5671

+0

@ anonymous5671 Oh, sorry, ich habe die Antwort aktualisiert. Rufen Sie '$ details = $ stmt-> fetch (PDO :: FETCH_ASSOC)' 'direkt auf. – prograhammer

Verwandte Themen