2013-02-25 19 views
0

我有三張表,tblMembers,tblBooks和tblReviews。這個想法是一個書評網站。這個INNER JOIN SQL查詢有什麼問題?

目前只有在書面評論中才會顯示書名,但是我希望書名隨時隨地顯示;要麼是評論列表,要麼是文本,「這個標題還沒有被評論。」

這個SQL查詢有什麼問題?

$sql = " 
SELECT * 
FROM tblBooks 
INNER JOIN tblReviews 
ON tblBooks.bookID = tblReviews.bookID 
INNER JOIN tblMembers 
ON tblReviews.userID = tblMembers.userID 
WHERE tblReviews.bookID = :bookID"; 


$query = $odb->prepare($sql); 

    $query->execute(array(":bookID" => $bookID)); 

    $results = $query->fetchAll(); 
    echo "<h1>".$results[0]['longTitle']."</h1>"; 
    if($results !== FALSE && $query->rowCount()>0) { 
     foreach($results as $result) { 
      echo "Reviewed by: " . $result['firstName'] . " " . $result['lastName']; 
      echo "<br />"; 
      echo "Rating: " . $result['rating']."/100"; 
      echo "<br />"; 
      echo "Date: " . $result['reviewDate'] . " " . $result['reviewTime']; 
      echo "<br />"; 
      echo "Review:"; 
      echo "<br />"; 
      echo $result['reviewText']; 
      echo "<hr />"; 
     } 
    } else { // the book has not been reviewed yet 
     echo "There are no reviews for this title yet"; 
    } 

如上所述,線echo "<h1>".$results[0]['longTitle']."</h1>";時,纔會執行,如果書有評論,我想在本書的詳細檢查,如果它有評論或不前。我怎樣才能做到這一點?

另外還有一點需要注意的是,我該如何檢查哪些書還沒有被評論過,並在結果中填入下拉列表? - 這已經回答了:d

我怎樣才能既:

填充兩個單獨的下拉列表,一個是有評論的書籍和一個用於尚未審查書(這個我能做到因爲我有上述問題的SQL)。

OR

填充單一的下拉列表中,但把書有在頂部,通過字符的字符串分隔的評論,讓我們說「----------這些書一直沒被審查過,但------------「後面還有尚未審查過的書籍。這可能嗎?

+0

你不能。你正在做內部連接,這意味着如果匹配記錄存在於所有連接的表中,你就會得到結果。如果沒有評論,你沒有記錄,因此沒有標題。你至少需要做兩個查詢,或者切換到使用LEFT連接。 – 2013-02-25 18:25:54

+0

如何使用LEFT JOINS,請提供一個示例。 – Mike 2013-02-25 18:26:52

+0

用戶左連接或右連接 - 內連接不起作用 – Vineet1982 2013-02-25 18:27:02

回答

1
SELECT * 
FROM tblBooks 
LEFT JOIN tblReviews 
ON tblBooks.bookID = tblReviews.bookID 
LEFT JOIN tblMembers 
ON tblReviews.userID = tblMembers.userID 
WHERE tblReviews.bookID = :bookID 

無論是否有評論或與其相關的會員,都將返回所有圖書。

如果有評論返回它,並且評論也有它的成員。否則NULL值將返回到與tblMembers或tblReviews相關的字段中。

+0

謝謝,這工作。 – Mike 2013-02-25 19:47:59