0

私は本と著者のためのデータベースを持っています。これら2つのエンティティ間の関係は多対多であるため、それらの間に共同テーブルがあります。

  1. booksbooks.book_idプライマリ、authors.author_idプライマリと同じであり、ジョイントテーブルbook_authorsには:book_authors.book_idとがありbook_authors.author_idます。

  2. 各本には複数の著者がいます。

私がやろうとしているのは、各本を1行で表示し、その下に次のように表示するphpページを作成することです。author1:....、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>
4

3 に答える 3

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 が行の著者と同じであることを再確認する必要があります。

もう 1 つの方法は、最初に書籍を選択し、次に foreach ループで book_authors テーブルを介してその書籍の著者を検索することです。

注意すべきもう 1 つの点は、mysql_*関数は非推奨であり、mysqli_*またはPDOの使用を検討する必要があることです。

于 2012-10-19T23:21:35.950 に答える
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 Persons INNER JOIN Orders ON Persons.P_Id=Orders.P_Id ORDER BY Persons.LastName

于 2012-10-19T23:23:02.613 に答える
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
于 2012-10-19T23:26:14.357 に答える