以下二维数组存储书籍信息(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"),
一本书可以有多个作者和多个出版商。 一个作者可以与多本书相关联。 出版商可以与多本书相关联。 发布者只能有一种声誉(来自值列表:“好”、“一般”、“差”)。
编辑:数据存储在3个表中。作者(author_id,author_name),书籍(book_id,book_name),出版商(publisher_id,publisher_name,publisher_reputation)。
我想创建一个包含以下列的 HTML 表格:
我目前正在使用以下代码:
<?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)
表2:
Book Name | Author(s) | Publisher(s) & Reputation(s)
BookA AuthorA PublisherA(good)
AuthorB
出版商 B,也与同一本书相关联(但声誉“不好”)不会显示。我确实明白这是因为声誉是从列表(“好”、“平均”、“坏”)中选择的,其值与任何单独的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_name(publisher_reputation = good)关联的所有book_names时,如何设计一个返回表1的查询? 任何帮助,将不胜感激。
我看不到完整的视图。当我查看您发布的所有内容时,我发现您错过了在“$result = $pdo->query(....”行中关闭括号的事情。
1) Books -> 存储书籍相关信息,外键为publisherId
2) Publisher -> 存储与publisher相关的信息,其中publisherId是PK
3) 声誉 -> HREF 表黑白书籍和出版商,两个表 PK 均为 FK。
从书籍中选择 * 作为 B INNER JOIN 发布者作为 P on P.publisherId = B.publisherId INNER JOIN 信誉为 R on (R.publisherId = B.publisherId AND R.publisherId = P.publisherId) WHERE R.Reputation ="GOOD"