0

次の 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 テーブルを作成したいと思います。

  1. ブック名 - フィールドには、特定のブックがリストされます。
  2. Author(s) - フィールドには、書籍に関連付けられているすべての著者がリストされます。
  3. 出版社と評判 - フィールドには、この本に関連付けられているすべての出版社 (およびその評判) が一覧表示されます。

現在、次のコードを使用しています。

<?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 を返すクエリを設計するにはどうすればよいですか? どんな助けでも大歓迎です。

4

2 に答える 2

1

全体像がわかりません。あなたが投稿したものを見回すと、「$result = $pdo->query(....」という行の括弧を閉じるのを忘れていることに気づきました。

于 2012-12-20T11:11:40.973 に答える
0

私はあなたのデータベースに3つのテーブルがあると仮定します -
1) 書籍 - > PublisherIdとして外部キーを持つ書籍関連情報を保存します
2) 出版社 - > publisherIdがPKである出版社関連情報を保存します
3) 評判 -> HREFテーブルの種類 b /w 両方のテーブル PK を FK とする書籍と出版社。

私が正しいと思うなら、次のクエリを検討できます-

SELECT * FROM books as B INNER JOIN publisher as P on P.publisherId = B.publisherId INNER JOIN Reputation as R on (R.publisherId = B.publisherId AND R.publisherId = P.publisherId) WHERE R.Reputation ="GOOD"

于 2012-12-20T11:20:06.193 に答える