2010-06-21 84 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