2010-06-21 60 views
1

我想使用Zend_db_select和JOIN构建查询。数据库如下:SELECT with JOIN

[AUTHOR表] PK: 'ID' ATTR: '名称'

[簿表] PK: 'ID' ATTR: '名称' FK:' author.id'

我有author.name作为参数。 我想检索所有相关书籍(只有book.name,而不是其他栏)

请帮忙。 感谢

回答

4

如果你确实需要使用Zend_Db_Select对象,你可以这样做:

$select = $db->select() 
    ->from(array("a"=>"AUTHOR"), array("author_name"=>"name")) 
    ->join(array("b"=>"BOOK"), "a.id = b.`author.id`", array("book_name"=>"name")) 
    ->where("a.name = ?", $authorName); 

$stmt = $select->query(); 

然而,这种带有常用的警告:有没有规定使用Zend_Db_Select对象为每个查询。当您的查询必须基于应用程序条件动态构建时,最好使用Zend_Db_Select。在这种情况下,没有理由使用Zend_Db_Select。

所以我会做这更清楚的只是用文字SQL:

$sql = " 
    SELECT a.name AS author_name, b.name AS book_name 
    FROM AUTHOR AS a JOIN BOOK AS b ON a.id = b.`author.id` 
    WHERE a.name = ?"; 
$books = $db->fetchAll($sql, $authorName); 

回复您的评论:Zend_Db_Select对象不在安全或性能方面,你不能得到的只是提供什么如同其他方式一样容易。无论您是使用Zend_Db_Select还是只为您的SQL使用单个文字字符串,最终结果都是一样的:您随后会将其准备为SQL查询。数据库不知道您创建该字符串的不同方式。

根据应用程序逻辑,应用程序通常会根据条件为SQL查询添加列,表或表达式。在这些场景中,有一个像Zend_Db_Select这样的类可以方便地添加子句到SQL查询。

但如果你有一个查询,需要任何动态的条款,它更简单,更具可读性,更容易调试和维护更方便表达SQL查询在一个字符串字面量,如在我的第二个例子以上。

至于安全性,您可以使用作者名称的参数占位符,并在准备查询后将该值作为参数提供。您可以像使用Zend_Db_Select一样轻松地使用文字SQL查询来完成此操作。

+0

非常感谢,有效。我知道我已经超出了原始问题的范围,但是您不能简单地阐述为什么在这里不需要使用Zend_Db_Select?一般来说,这样做没有任何优势(性能或安全性)? – Max 2010-06-21 21:01:03

+0

这听起来像是一个自信的答案。我要买它。再次感谢。如果我可以说,“很高兴结束”。 – Max 2010-06-22 08:13:07