2011-06-28 15 views
0

一連のマスターに基づいて詳細を一覧表示する結果ページを作成しようとしています。PHP PDOを使用したマスター/ディテール

ここでは、以下に示すような

3つのテーブル...サンプル問題です:

Book (id, title) 
Author (id, name) 
BookAuthors (bookID, authorID) 

私はこのようなリストを生成したい:ように

Book Title 1 
    Author 1 
    Author 2 
Book Title 2 
    Author 3 
Book Title 3 
    Author 1 
    Author 4 

をし、 。

私はこれを達成するためにPHP PDOを使いたいと考えています。

私は巣に期待していた...私が持っている問題は、準備された文を入れ子にすることができないときにPDOから結果を横断について移動する方法の詳細です

を[詳細を更新しました]クエリ内のクエリと第一クエリの結果を使用するには、[私は本のタイトルにフィルタが含まれるように問合せを拡張しましたが、これは、このようにセット全体を返す空白になることがあります]:その後、

select id as idBook,title from book where title like %:title% 

にします各書籍の作者のリストを作成する

select name from author, bookauthors 
    where bookauthor.authorid = author.id 
    AND bookauthor.bookid = :idBook: 

ここで、idBook:1番目のクエリの結果セットの次の帳IDです。第一クエリで検索された本の数が大きくなる可能性が通り

、私は可能な場合はfetchAll使用しないことを期待していた...

誰もがこのため、ポインタ/試料溶液のコードを得ましたか。

事前に感謝します。

+0

サンプルコードはありませんが、私はあなたに愛と幸福を送ります。あなたは 'join'を探しています。 – hakre

+0

[JOINクエリのPhp pdo結果]の重複が可能です。(http://stackoverflow.com/questions/1380691/php-pdo-result-of-join-query) – hakre

+0

@hakre私はジョイントを使用することを理解しています。私が持っている問題は結果を横断しています。私は、クエリ内でクエリを入れ子にし、最初のクエリの結果を使用することを望んでいた(idBookのidをbookから選択)、各書籍の著者のリストを作成する(authorから名前を選択、bookauthor where bookauthor.authorid = author.id AND bookauthor.bookid =:idBook :) – Ady

答えて

0

複数のクエリの代わりに、私はむしろphp変数にいくつかの状態を格納します。この場合、あなたが知る必要があるのは、本が「変更されました」、つまりスクリプトがタイトルを印刷する必要があることだけです。

<?php 
$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly', array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)); 
foo($pdo); // add test data 

$r = $pdo->query(' 
    SELECT 
    l.bookID, b.title, a.name 
    FROM 
    BookAuthor as l 
    JOIN 
    Author as a 
    ON 
    a.id=l.authorID 
    JOIN 
    Book as b 
    ON 
    b.id=l.bookID 
    ORDER BY 
    l.bookID, 
    l.authorID 
'); 
$currentBook = null; 
foreach($r as $row) { 
    if ($currentBook!=$row['bookID']) { 
    echo $row['title'], "\n"; 
    $currentBook=$row['bookID']; 
    } 
    echo ' ', $row['name'], "\n"; 
} 

function foo($pdo) { 
    $pdo->exec('create temporary table Book (id int auto_increment, title varchar(48), primary key(id))'); 
    $pdo->exec('create temporary table Author (id int auto_increment, name varchar(48), primary key(id))'); 
    $pdo->exec('create temporary table BookAuthor (bookID int, authorID int)'); 

    $pdo->exec("INSERT INTO Author (id,name) VALUES (1,'Author1'),(2,'Author2'),(3,'Author3'),(4,'Author4')"); 
    $pdo->exec("INSERT INTO Book (id,title) VALUES (1,'Book Title 1'),(2,'Book Title 2'),(3,'Book Title 3')"); 
    $pdo->exec("INSERT INTO BookAuthor (bookID,authorID) VALUES (1,1),(1,2),(2,3),(3,1),(3,4)"); 
} 
+0

それは私の次の考えでしたが、可能ならばそれを避けたかったのです...私はfetchall()アイデアを試してきましたが、アイデアも実装して比較します。ありがとうございました – Ady

関連する問題