2012-10-19 55 views
0

我有書籍和作者的數據庫。這兩個實體之間的關係是多對多的,所以它們之間有一個聯合表。php mysql數組結果問題

  1. books具有books.book_id伯,authors.author_id作爲初級和關節表book_authors具有:book_authors.book_idbook_authors.author_id

  2. 每本書都有一個以上的作者。

我所試圖做的是有一個PHP頁面,顯示然後在每本書的一條線,它說:作者1:......,author2(如適用)

我想我的PHP看起來有點像:

Book Name: THE BOOK NAME 
Author(s): joe- John- Sara 

我用下面的代碼,問題是它返回單結果。因此,如果book1由多個作者撰寫,則每次都會使用不同的作者顯示多次。我所試圖做的是讓每本書後面的作者

<html> 
<body> 

<?php 
$con = mysql_connect("localhost","myusername","mypassword"); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("mydb", $con); 

$result1 = mysql_query(" 
    SELECT books.title, authors.fname, authors.lname 
    FROM books, book_authors, authors 
    WHERE books.book_id = book_authors.book_id 
    AND authors.author_id=book_authors.author_id"); 


while($row = mysql_fetch_array($result1)) 
    { 
print "<h3>Book Name:</h3>"; 
    echo $row ['title']; 
print "<br />"; 
print "Author(s):"; 
    echo $row ['fname']; 
    echo $row ['lname']; 
    echo "<br />"; 
    } 

mysql_close($con); 
?> 

</body> 
</html> 
+1

那是因爲,你在你的查詢中使用'集團By'。請先遵循一些'SQL'教程。 –

+0

你可以var_dump這個查詢的輸出示例嗎? – Ollie

+0

@HamzaWaqas我參加了這個團隊,我得到的是每本書每次都有一位作者列出。 –

回答

0

這裏的數組是一個查詢應該做的伎倆:

SELECT books.title, authors.fname, authors.lname FROM books LEFT JOIN 
book_authors ON books.book_id = book_authors.book_id LEFT JOIN authors 
ON authors.author_id = book_authors.author_id 

你必須仔細檢查該book_id與行作者相同。

另一種方法是首先選擇書籍,然後在您的foreach循環中,通過book_authors表查找該書籍的作者。

要注意的另一件事是mysql_*功能已被棄用,你應該看看使用mysqli_*PDO

+0

看起來不錯。但我實際上正在尋找的是foreach循環。我會看看。謝謝 –

0

您的sql查詢不正確。它需要像這樣形成。

SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name

SELECT books.title, authors.fname, authors.lname FROM books INNER JOIN authors ON books.book_id = authors.book_id

SELECT Persons.LastName,Persons.FirstName,Orders.OrderNo FROM人員 INNER JOIN訂單 ON Persons.P_Id = Orders.P_Id ORDER BY Persons.LastName

0

嘗試group_concat

SELECT books.title, group_concat(concat(authors.fname,' ',authors.lname) AS Authors 
FROM books, book_authors, authors 
WHERE books.book_id = book_authors.book_id 
AND authors.author_id=book_authors.author_id 
GROUP BY books.title 

然後在PHP

while($row = mysql_fetch_array($result1)) 
    { 
    print "<h3>Book Name:</h3>"; 
    echo $row ['title']; 
    print "<br />"; 
    $authors = explode($row['Authors']); //array of authors 

    for($authors as $author) 
    { 
     echo($author.'<br/>') 
    } 
    } 

您可以使用JOIN代替

SELECT books.title, GROUP_CONCAT(authors.fname) AS Authors 
FROM books 
LEFT JOIN book_authors ON books.book_id = book_authors.book_id 
LEFT JOIN authors ON book_authors.author_id = authors.author_id 
GROUP BY books.title 
+0

它是非常有意義的,這就是我正在尋找的。我嘗試過,但由於某種原因,現在根本沒有顯示任何結果。任何想法? –

+0

替換這部分,看看會發生什麼:'group_concat(authors.fname)' – codingbiz

+0

做到了這一點,但仍然沒有改變! –