2015-07-21 95 views
0

我想在ZEND 1.12中執行以下查詢。ZEND中的複雜查詢

SELECT B . * , COUNT(*) AS CT 
FROM `blogpost` B 
JOIN `blog_likes` L 
WHERE B.`blog_id` = L.`blog_id` 
AND L.liked_post = 'Y' 
GROUP BY B.`blog_id` 
ORDER BY CT DESC 
LIMIT 0 , 10 

我嘗試下面的代碼,但我想這是不是返回正確的輸出:

$this->getDbTable()->select() 
->setIntegrityCheck(false) 
->from(array('B' => 'blogpost'), array("B.*", "COUNT(*) AS CT")) 
->join(array('L' => 'blog_likes'), 'B.blog_id = L.blog_id')     
->where("L.liked_post =?", 'Y') 
->group ("B.blog_id") 
->order ("CT DESC") 
->limit($limit); 

任何一個可以幫我嗎?

+0

你的代碼輸出有什麼問題? –

回答

0

首先,您需要傳遞給您寫入的每個連接以及要從該表中選擇的列,因此,如果您不想從L表中選擇任何列,您的加入應該是這樣的:

->join(array('L' => 'blog_likes'), 'B.blog_id = L.blog_id', array()) 

如果你離開的最後一個參數爲空,它會選擇所有列(L. *)。

其次,列的陣列,其傳遞給一個從或加入,可以設置別名通過使用該密鑰的值,即:

->from(array('B' => 'blogpost'), array("B.*", "CT" => "COUNT(*)")) 

這使得更具有可讀性。

最後但並非最不重要的是,你在計算from,那將不會計算內部表所有的行,但只包括from的。所以,如果你想從決賽桌數行,我猜你是想用SQL語句,你必須做的是:

$this->getDbTable()->select() 
    ->setIntegrityCheck(false) 
    ->from(array('B' => 'blogpost'), array("B.*")) 
    ->join(array('L' => 'blog_likes'), 'B.blog_id = L.blog_id', array("CT" => "COUNT(*)"))     
    ->where("L.liked_post =?", 'Y') 
    ->group ("B.blog_id") 
    ->order ("CT DESC") 
    ->limit($limit); 

計數可有點怪怪的使用,所以我建議你用這種方式來代替:

$this->getDbTable()->select() 
    ->setIntegrityCheck(false) 
    ->from(array('B' => 'blogpost'), array()) 
    ->join(array('L' => 'blog_likes'), 'B.blog_id = L.blog_id', array())     
    ->where("L.liked_post =?", 'Y') 
    ->group ("B.blog_id") 
    ->order ("CT DESC") 
    ->limit($limit) 
    ->columns(array(
     "B.*", 
     "CT" => "COUNT(*)"  
    )); 

要了解更多信息,請轉到Zend_Db_Select documentation.

我希望這有助於。