我一直试图创建一个基于一系列主人列出详细信息的结果页面。
这是一个示例问题......
如下所示的三个表格:
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的结果...
我希望在查询中嵌套查询并使用第一个查询的结果[我扩展了查询以在书名中包含一个过滤器,但这可能是空白的,因此返回整个集合]:< / p>
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:是第一个查询结果集中的下一个书籍ID。
由于在第一次查询中检索的图书数量可能很大,我希望如果可能的话不要使用fetchall ...
任何人都有指针/示例解决方案代码吗?
提前多多感谢!
答案 0 :(得分: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)");
}