是否可以“连接”查询结果?

问题描述:

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

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

  • 搜索作者作者表
  • 匹配查询
  • 获取作者的AUTHORID
  • 具有相同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中这样做。有没有任何功能/操作符可以让我做到这一点?是的,我试过+=,即使我对它没有多少期待,也没有想到会有一个丑陋的输出。

再一次,我对伪代码表示歉意。我会尝试清理我的代码并尽快编辑,但如果在此之前有答案,它就会变得非常棒。谢谢。

+0

有什么不对的加入书和作者在查询中? – wildplasser 2012-04-04 20:08:30

+2

我不知道Codeigniter,但你需要的查询看起来像这样:'SELECT author。*,book。* FROM author LEFT JOIN book ON author.authorid = book.authorid WHERE author.authorid = ' – 2012-04-04 20:10:06

+0

我承认还没有看过JOINS呢。将尝试他们并稍后再报告。谢谢。 – skytreader 2012-04-04 20:13:11

我与迈克尔同意,看来你需要或者一个INNER JOINLEFT JOIN

你说你正在使用笨所以这里是一个笨具体的例子:

$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); 

另见:

+0

找出如何在我的查询中使用连接,但感谢CodeIgniter特定示例( - ,) – skytreader 2012-04-06 18:28:23

做一个串连在PHP中,使用

.= 
+0

'+ ='是伪代码的一部分,'。='是一个字符串连接符,对追加查询结果极为无用...... – 2012-04-04 20:08:05

+0

他想连接字符串。除非你有更好的方法来存储事物的名字。 声明一个变量,然后打开查询结果循环和。=结果。 – 2012-04-04 20:10:25

+0

此外,我认为'。='完全是字符串,'+ ='是for,ummm,其他所有内容,数字数据等等(显然不是)。是的,即使在我的真实代码中,我也尝试过'+ ='。我想连接记录,其中,AFAIK是指针/光标,而不是字符串。 – skytreader 2012-04-04 20:10:56

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

+0

嗯,MySQL将'UNION'实现为'UNION's。 'LEFT JOIN'是一个完全不同的概念。 – 2012-04-04 20:11:18

您可以使用.=来连接。然而,更有效,你可以简单地指定多个WHERE子句中的SQL,所以你必须在下面的伪代码:

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