0

我正在实现基于作者的图书搜索功能。我应该返回一个查询结果,其中包含被查询作者所写的所有书籍。但是,对某些作者姓名的查询可能会返回多个结果(例如,“Smith, W”的查询可能匹配“Smith, Wesson”和“Smith, Will”)。

所以,我的问题是如何“连接”这些不同作者所写的所有书籍。如果我不考虑多个作者匹配查询的可能性,我会这样做(在伪代码中,因为我的真实代码现在非常混乱):

  • 在作者表中搜索作者
  • 匹配查询
  • 获取作者的authorid
  • 在 book table 中搜索具有相同 authorid 的书籍记录

但是,由于可能有多个作者,我有这样的想法:

// search author table for authors matching the query

foreach(author_match as am){
  // search book table for book records with authorid=am.authorid
  // Is there such thing as this? :\
  book_results += all the rows returned by previous query
}
return book_results;

我在 PHP(使用 CodeIgniter 框架)和 MySQL 中执行此操作。是否有任何功能/运算符可以让我这样做?是的,我已经尝试过+=,即使我对它的期望不高,但输出却很丑陋。

再次,我为伪代码道歉。我会尝试清理我的代码并尽快编辑,但如果在此之前有答案,那就太好了。谢谢。

4

4 回答 4

2

我同意迈克尔的观点,看来您需要 anINNER JOINLEFT JOIN.

你说你正在使用 Codeigniter 所以这里是一个 Codeigniter 特定的例子:

$this->db->select('author.*, 
                   book.*');
$this->db->from('authors');
$this->db->join('books', 'books.authorid = authors.id', 'left');
$this->db->where('authors.id', $the_author_id);

另见:

于 2012-04-04T20:22:28.963 回答
1

您可以使用.=连接。但是,更有效的是,您可以简单地在 SQL 中指定多个 WHERE 子句,因此您将拥有以下伪代码:

search author table for authors matching the query
where = 'with '
foreach(author_match as am){
where += 'authorid=' . am.authorid . ' OR' }
where = substr(where[0,strlen(where)-3)
}
search book table for book records [where clause here]
return book_results
于 2012-04-04T20:11:28.113 回答
0

也许您可以修改查询以使用 LEFT JOIN。这样,您可以在一个查询中获得多个查询结果。

于 2012-04-04T20:10:40.423 回答
-1

要在 PHP 中进行连接,请使用

.=
于 2012-04-04T20:07:09.177 回答