次の 2 次元配列には、書籍の情報が格納されます (1.ID、2.名前、3.著者 ID、4.著者名、5.出版社 ID、6.出版社名、7.出版社の評判)。
$books = array(array('book_id'=>1, 'book_name'=>"BookA", 'author_id'=1,
'author_name'=>"AuthorA", 'publisher_id'=>1,
'publisher_name'=>"PublisherA", 'publisher_reputation'="good"),
array('book_id'=>1, 'book_name'=>"BookA", 'author_id'=1,
'author_name'=>"AuthorA", 'publisher_id'=>2,
'publisher_name'=>"PublisherB", 'publisher_reputation'="bad")
array('book_id'=>1, 'book_name'=>"BookA", 'author_id'=>2,
'author_name'=>"AuthorB", 'publisher_id'=>1
'publisher_name'=>"PublisherA", 'publisher_reputation'=>"good"),
array('book_id'=>1, 'book_name'=>"BookA", 'author_id'=>2,
'author_name'=>"AuthorB", 'publisher_id'=>2
'publisher_name'=>"PublisherB", 'publisher_reputation'=>"bad"),
1 つの本に複数の著者と複数の出版社が存在する場合があります。著者は複数の書籍に関連付けることができます。出版社は複数の書籍に関連付けることができます。パブリッシャーが持つことができる評判は 1 つだけです (値のリストから: 「良い」、「平均」、「悪い」)。
編集: データは 3 つのテーブルに格納されます。著者 (author_id、author_name)、本 (book_id、book_name)、出版社 (publisher_id、publisher_name、publisher_reputation)。
次の列を持つ HTML テーブルを作成したいと思います。
- ブック名 - フィールドには、特定のブックがリストされます。
- Author(s) - フィールドには、書籍に関連付けられているすべての著者がリストされます。
- 出版社と評判 - フィールドには、この本に関連付けられているすべての出版社 (およびその評判) が一覧表示されます。
現在、次のコードを使用しています。
<?php function transform($books) {
$result = array();
foreach($books as $key => $book) {
$book_id = $book['book_id'];
if (!isset($result[$book_id])) {
$result[$book_id] = array(
'author_name' => array(),
'publisher_name'.'publisher_reputation' => array(),
'book_name' => $book['book_name']
);
}
$result[$book_id]['publisher_name'.'publisher_reputation'] =
array_merge($result[$book_id]['publisher_name'.'publisher_reputation'],
array(($book['publisher_name'].'('.$book['publisher_reputation'].')')));
$result[$book_id]['author_name'] = array_merge($result[$book_id]
['author_name'], array(($book['author_name'])));
}
foreach($result as $key => $data) {
$result[$key]['publisher_name'.'publisher_reputation'] =
array_unique($result[$key]['publisher_name'.'publisher_reputation']);
$result[$key]['author_name'] = array_unique($result[$key]['author_name']);
}
return $result;
}
$books = transform($books)
;?>
テーブルを作成するための私のhtmlコード:
<table>
<tr>
<th>Book Name</th>
<th>Author(s)</th>
<th>Publisher(s) & Reputation(s)</th>
</tr>
<?php foreach ($books as $book): ?>
<tr>
<td><?php htmlout($book['book_name']); ?></td>
<td><?php foreach(($book['author_name']) as $author_name): ?>
<?php htmlout($author_name);?><br /><?php endforeach; ?></td>
<td><?php foreach(($book['publisher_name'.'publisher_reputation']) as
$publisher_namereputation): ?></td>
<?php htmlout($publisher_namereputation);?><br /><?php endforeach; ?></td>
</tr>
<?php endforeach; ?>
結果の表 (表 1.):
Book Name | Author(s) | Publisher(s) & Reputation(s)
BookA AuthorA PublisherA(good)
AuthorB PublisherB(bad)
- 必要に応じて: 「著者 A (WHERE author_id=1) によるすべての本」を照会すると、上記の結果が得られます。
- 必要に応じて: 「PublisherA (WHERE publisher_id=1) によって発行されたすべての本」をクエリすると、上記の結果が得られます。
- 問題:「reputation = good (WHERE publisher_reputation = "good") の出版社によって発行されたすべての本」をクエリすると、次の結果が得られます。
表 2.:
Book Name | Author(s) | Publisher(s) & Reputation(s)
BookA AuthorA PublisherA(good)
AuthorB
まったく同じ本に関連付けられている (ただし、評判が「悪い」) PublisherB は表示されません。これは、評価が個々の publisher_id に関連付けられていないリスト (「良い」、「平均」、「悪い」) から選択されたためであることは理解しています (複数の発行者が同じ評価を持つことができます)。次の方法で評判リストを準備することで、問題を解決しようとしました。
try
{
$result = $pdo->query('SELECT publisher_id, publisher_reputation FROM publisher');
}
catch (PDOException $e)
{
$error = 'Error fetching publisher reputation information!';
include 'error.html.php';
exit();
}
foreach ($result as $row)
{
$reputations[] = array('publisher_id' => $row['publisher_id'],
'publisher_reputation' => $row['publisher_reputation']);
}
(...)
ただし、これにより、値が繰り返されるレピュテーションのリストが得られます (同じレピュテーションを持つ複数のパブリッシャーがデータベースにある場合)。
質問: publisher_reputation = good で、publisher_name に関連付けられているすべての book_names を検索するときに、表 1 を返すクエリを設計するにはどうすればよいですか? どんな助けでも大歓迎です。